【问题标题】:Sanitize the different formats of CSV-formatted phone numbers清理不同格式的 CSV 格式的电话号码
【发布时间】:2015-05-19 21:53:37
【问题描述】:

假设有如下几种不同的 CSV 格式的电话号码:

这是第一个 CSV 文件,其行如下:

"Name","Address","FullPhone"
"Mike Wise","101 Abc Drive","4061234567" // Need to separate area code from the rest

这是另一个 CSV 文件,其行如下:

"Name","Address","Areacode","Phone"
"Mike Wise","101 Abc Drive","406","123-4567" // Need to remove the dash in the seven-digit phone number

是否有某种 sed one-liner 可以使其成为以下通用格式?

"Name","Address","NPA","TELNO"
"Mike Wise","101 Abc Drive","406","1234567"

我更喜欢 sed 单行,但如果它必须不止一行,那就这样吧。此外,不需要 sed。只是觉得 sed 可能更容易,虽然我还没有想出一个 sed 解决方案。

【问题讨论】:

  • @EdMorton 是的,它们位于两个不同的文件中,每个文件都有两种格式。感谢您提醒我这一点。

标签: csv awk sed ksh


【解决方案1】:
$ cat tst.awk
BEGIN { FS=OFS="\",\"" }
{
    if (NR==1) {
        $3 = "NPA"
        $4 = "TELNO\""
    }
    else {
        gsub(/-/,"",$NF)
        if (NF==3) {
            sub(/.{3}/,"&"OFS,$NF)
        }
    }
    print
}

$ cat file1
"Name","Address","FullPhone"
"Mike Wise","101 Abc Drive","4061234567"

$ awk -f tst.awk file1
"Name","Address","NPA","TELNO"
"Mike Wise","101 Abc Drive","406","1234567"

$ cat file2            
"Name","Address","Areacode","Phone"
"Mike Wise","101 Abc Drive","406","123-4567"

$ awk -f tst.awk file2
"Name","Address","NPA","TELNO"
"Mike Wise","101 Abc Drive","406","1234567"

还有一些您没有要求但可能会发生的特定输入,并且无论如何都会正确处理:

$ cat file3
"Name","Address","FullPhone"
"Mike Wise","101 Abc Drive","406-1234-567"

$ awk -f tst.awk file3
"Name","Address","NPA","TELNO"
"Mike Wise","101 Abc Drive","406","1234567"

如果您需要从输入的电话号码中删除空格,而不仅仅是 -s,那么只需将 gsub(/-/,"",$NF) 更改为 gsub(/[-[:space:]]/,"",$NF)gsub(/[^0-9]/,"",$NF) 或类似名称。

【讨论】:

  • 这些列表位于两个不同的 CSV 文件中。我还想用"NPA""TELNO" 将相应的标题更改为通用标题。
【解决方案2】:
sed '1 c\
"Name","Address","Areacode","Phone"
     s/"\([0-9]\{3\}\)\([0-9]\{7\}\)"[[:space:]]*$/"\1","\2"/
     s/-\([0-9]\{1,6\}\)"[[:space:]]*$/\1"/
     ' YourFile

将适用于您的 csv 文件格式(也适用于 @EdMorton 评论后的标题)

  • 1c \:将第一行改成下面一行(强制用这个代替原来的标题)
  • first s/// 将更改任何 ta 尾随 3 位数字后跟 7 位数字(因此 1 包中有 10 位数字)的行,并用双引号括起来,其中 2 个字段值分别为 3 和 7 位,每个使用 s/ 的组功能//
  • second s/// 将更改尾随 - 后跟 1 到 6 位数字和双引号,而不使用 - 使用组功能(参考 \1)。

第一个 s/// 不会取第二个样本的行(没有模式对应),第二个不会取第一个样本的行(同样的原因),也不会取第一个 s/// 改变的行(还是一样的原因) 第二行

【讨论】:

  • @EdMorton 非常好的评论,我会更改代码,对不起
  • 正确忘记第一次替换时的数字捕捉,更正完成
  • 太棒了,现在可以完美运行了。您能否详细说明第二个 sed 正则表达式?还不是很明白。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-31
  • 2014-04-01
  • 2012-08-11
  • 2012-07-16
  • 2016-05-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多