繁体   English   中英

如何通过awk分隔csv列,并且用逗号作为字段分隔符?

[英]How to separate csv columns by awk, with a comma being the field separator?

我的正则表达式在带有命令行 field separator awk的csv文件中不起作用。

我的csv以逗号( , )分隔,但某些字段本身也包含逗号。

data.csv类似于:

t1,t2,t3,t4
field without comma,f02,f03,f04
field, with comma,f12,f13,f14
field without comma,f22,f23,f24
field without comma,f22,f23,f34

如果我们在field, with comma,f12,f13,f14看到field, with comma,f12,f13,f14 ,则有两种逗号:

  1. 逗号是数据的一部分(在字段内部),与field, with comma一样field, with comma ,并且;
  2. 逗号分隔字段,f12,f13,f14

所以我用-Fregex尝试了awk:

awk -F'/\B\,/\B/' '!seen[$2]++' data.csv > resulted.csv

我的策略是: field separator必须是逗号\\,在No-Word-Boundary \\B

因此,我的命令没有输出resulted.csv 但输出警告:

gawk: warning: escape sequence `\B' treated as plain `B'
gawk: warning: escape sequence `\,' treated as plain `,'

所需的result.csv将删除重复的行,例如:

t1,t2,t3,t4
field without comma,f02,f03,f04
field, with comma,f12,f13,f14
field without comma,f22,f23,f24

在没有GNU awk的情况下,对于数据,您可以使用gsub", "字符串替换为一些非冲突字符,例如"__" ,以","上的常规字段分隔字段,然后恢复该字段内的逗号(例如", " ),再次使用gsub 例如:

 awk -F, -v OFS=, '
    { gsub(/, /,"__"); for (i = 1; i <= NF; i++) gsub(/__/,", ", $i) }
    !seen[$0]++
' file.csv

gsub(/, /,"__")上方用输入记录中的两个下划线替换所有出现的", " 然后遍历每个字段,将任何"__"替换为", "恢复该字段中的原始逗号。

使用/输出示例

根据您的数据,以上结果将导致:

$ awk -F, -v OFS=, '
>     { gsub(/, /,"__"); for (i = 1; i <= NF; i++) gsub(/__/,", ", $i) }
>     !seen[$0]++
> ' file.csv
t1,t2,t3,t4
field without comma,f02,f03,f04
field, with comma,f12,f13,f14
field without comma,f22,f23,f24

使用GNU awk:

awk -F ',[^ ]' '!seen[$2]++' data.csv

输出:

t1,t2,t3,t4
field without comma,f02,f03,f04
field, with comma,f12,f13,f14
field without comma,f22,f23,f24

如果要使用t2列作为键值,那么您将按照以下方式进行操作:

$ awk -F, '!seen[$(NF-2)]++' data.csv
t1,t2,t3,t4
field without comma,f02,f03,f04
field, with comma,f12,f13,f14
field without comma,f22,f23,f24

如果要使用t1列作为键,那么您将按照以下方式进行操作:

$ awk '{key=$0; sub(/(,[^,]+){3}$/,"",key)} !seen[key]++' data.csv
t1,t2,t3,t4
field without comma,f02,f03,f04
field, with comma,f12,f13,f14

如果还有其他问题,请澄清您的问题并更新示例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM