使用 sed 从 CSV 中删除引号中的数字分隔逗号和引号本身?

使用 sed 从 CSV 中删除引号中的数字分隔逗号和引号本身?

如何使用 sed 从最后一列之前删除组数字字符逗号和引号本身?

请注意,在下面的示例中,目标列未包含在双引号中。

0,1,,,"10,815,197",
6,7,010202,,"5,589",
6,7,010202,,589,

预期结果是:

0,1,,,10815197,
6,7,010202,,5589,
6,7,010202,,589,

答案1

Awk将是最适合您的场景。

$ awk -F'"' '{gsub(",", "", $2);print}' file.txt 
0,1,,, 10815197 ,
6,7,010202,, 5589 ,
6,7,010202,,589,

怎么运行的

-F'"' - 导致AWK使用双引号 (") 作为记录分隔符。

gsub(",","",$2)-gsub函数将搜索所有出现的双引号并将其替换为空字符串。

print - 将修改后的内容打印到输出中。

答案2

我认为使用 更容易awk。你可以尝试这样的事情:

$ awk -v v='"' 'BEGIN{FS=OFS=v}{gsub(",","",$2);gsub("\"","",$0);print }' file.txt
0,1,,,10815197,
6,7,010202,,5589,
6,7,010202,,589,
  • 基本上,您是awk在告诉使用正则表达式-v v='"'将其用作字段分隔符。
  • FS=OFS=v说字段分隔符与输出字段分隔符相同,即".
  • gsub (",","",$2),将第二个字段中的替换为空$2(在开头和结尾处用 分隔")。
  • gsub("\"","",$0)获取整行并"在打印输出该行之前替换任何内容。

答案3

sed 不是适合此目的的工具。

$ perl -pe 's|"([\d,]+)"(?=[^"]*$)|$1=~y/,//dr|eg' file
0,1,,,10815197,
6,7,010202,,5589,
6,7,010202,,589,

通过Python。

#!/usr/bin/python3
import sys
import re
file = sys.argv[1]
with open(file, 'r') as f:
    for line in f:
        print(re.sub(r'"([\d,]+)"(?=[^"]*$)', lambda m: m.group(1).replace(',', ''), line), end = "")

将上面的脚本保存到文件中,script.py然后运行,然后通过在终端上触发以下命令来运行脚本。

$ python3 script.py inputfile

相关内容