我有一个|
分隔的文件,我需要在第三列中搜索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列。
答案 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}}:
"