0

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

文件1.txt

xx|yy|xx|12

输出文件:

xx|yy||12

我通过这个实现了

awk 'BEGIN {FS=OFS="|" } $3 ~ /[[:alnum:]]/ { $3="" }1' file

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

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

所以输出应该是这样的:

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

所以 AAA 应该用 null 替换,因为 AAA 作为第 4 列。

4

2 回答 2

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 解析模块的高级语言,例如 python。

于 2013-08-11T17:35:51.827 回答
0

我喜欢@sudo_O 的回答,我只是不确定它为什么会起作用,因为它"yy满足 FPAT RE 的第一部分,[^|]+所以我不知道为什么 gawk 不会认为这是一个字段,而不是推迟并将其视为的一部分"yy|xx"与 FPAT 的第二部分匹配的较大者, "[^"]+"

无论如何,如果您没有 gawk,您始终可以在\t对输入进行操作之前将字段之间或引用字段内的“FS”更改为其他字符(例如),只需将"其视为 FS:

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

$ awk 'BEGIN{FS=OFS="\""} {for (i=1;i<=NF;i+=2) gsub(/\|/,"\t",$i)}1' file
xx      yy      "xyz|xx"        AAA     12

$ awk 'BEGIN{FS=OFS="\""} {for (i=2;i<=NF;i+=2) gsub(/\|/,"\t",$i)}1' file
xx|yy|"xyz      xx"|AAA|12
于 2013-08-11T18:42:52.683 回答