忽略管道分隔文件中的管道

时间:2013-08-11 17:22:15

标签: shell unix csv awk

我有一个|分隔的文件,我需要在第三列中搜索char并用null替换它。我只需要替换第3个字段中出现字符的列。

FILE1.TXT

xx|yy|xx|12

输出文件:

xx|yy||12

我用

实现了这个目标
awk 'BEGIN {FS=OFS="|" } $3 ~ /[[:alnum:]]/ { $3="" }1' file

但是我面临的是,如果有任何列具有应该被视为单列的管道char,则不应将其计为字段分隔符。

xx|yy|"xyz|xx"|AAA|12...

所以输出应该是这样的:

xx|yy|"xyz|xx"||12

所以AAA应该替换为null,将AAA视为第4列。

2 个答案:

答案 0 :(得分:4)

使用GNU awk,您需要使用FPAT来描述字段的内容,而不是使用FS来描述字段分隔符。例如:

$ cat file
xx|yy|AAA|12
xx|"yy|xx"|AAA|12

$ awk '{$3=""}1' OFS='|' FPAT='([^|]+)|("[^"]+")' file
xx|yy||12
xx|"yy|xx"||12

但是,您可能更好地使用具有CSV parsing模块的更高级语言,例如python。

答案 1 :(得分:0)

我喜欢@ sudo_O的答案,我只是不确定为什么它有效,因为"yy满足FPAT RE [^|]+的第一部分所以我不知道为什么gawk不会假设那样是一个字段,而不是阻止并将其视为与FPAT的第二部分"yy|xx"匹配的较大"[^"]+"的一部分。

无论如何,如果你没有gawk,你可以随时改变字段之间或引用字段内的“FS”到其他字符(例如\t),然后通过处理{{最初作为FS的1}}:

"