[英]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
,则有两种逗号:
field, with comma
一样field, with comma
,并且; ,f12,f13,f14
。 所以我用-F
和regex尝试了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.