【发布时间】:2019-12-22 07:10:55
【问题描述】:
我的正则表达式在 its command linefield 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。
所以我尝试了 awk,使用 -F 和 regex:
awk -F'/\B\,/\B/' '!seen[$2]++' data.csv > resulted.csv
我的策略是:field separator 必须是无字边界 \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
【问题讨论】:
-
这不是一个有效的 CSV 文件。如果字段包含逗号,则需要将其括在引号中。否则无法判断逗号在字段内而不是分隔符内。
-
@Barmar,我同意这不是有效的 csv(需要分隔符、分隔符、转义字段内容中的字符等)。但这就是数据。即便如此,看看我对 2 种逗号的观察。如果逗号在它的左右有边界2个单词(word= char + digit + underline)那么它是一个分隔符;如果逗号只限定一个单词,那么它就是一段内容。我的问题是正则表达式没有逃脱
\B也没有\,。 -
uniq data.csv? -
@Cyrus,我不能在这里使用
uniq,因为所有行都是唯一的。 awk 这里需要:用正则表达式分隔列(-F),获取一列用作键($2),过滤每一列(!seen),然后全部输出。 -
awk不使用 PCRE,它不支持许多转义序列。
标签: regex csv awk ubuntu-18.04