使用AWK使用多字符字段分隔符

But*_*eon 4 awk

我遇到AWK的字段分隔符问题,输入文件如下所示

1 | 所有| | 同义词|
1 | 根| | 学名|
2 | 细菌| 细菌| 学名|
2 | Monera | Monera | 部分|
2 | Procaryotae | Procaryotae | 部分|
2 | 原核生物| 原核生物| 部分|
2 | 原核生物| 原核生物| 部分|
2 | 细菌| 细菌| 爆炸名称|

这里的字段分隔符是制表符,管道,制表符,\t|\t 所以我尝试只打印第1列和第2列

awk -F'\t|\t' '{print $1 "\t" $2}' nodes.dmp | less
Run Code Online (Sandbox Code Playgroud)

而不是所需的输出,输出是第一列,后跟管道字符.我试图逃避管道\t\|\t,但输出保持不变.

1 |
1 |
2 |
2 |
2 |
2 |

打印第1列和第3列给了我原始的预期输出.

awk -F'\t|\t' '{print $1 "\t" $3}' nodes.dmp | less
Run Code Online (Sandbox Code Playgroud)

但我很困惑为什么这不按预期工作.

我明白下面的perl one liner会起作用,但我真正想要的是使用awk.

perl -aln -F"\t\|\t" -e 'print $F[0],"\t",$F[1]' nodes.dmp | less
Run Code Online (Sandbox Code Playgroud)

dev*_*ull 6

管道|性格似乎是混乱awk到思想,\t|\t意味着字段分隔符可以是一个\t\t.告诉awk |从字面上解释.

$ awk -F'\t[|]\t' '{print $1 "\t" $2}'
1   all
1   root
2   Bacteria
2   Monera
2   Procaryotae
2   Prokaryota
2   Prokaryotae
2   bacteria
Run Code Online (Sandbox Code Playgroud)

  • 要清楚 - 使用`\ t |\t`并不会让awk感到困惑; awk完全理解它完全意味着它的含义,FS是`\ t`或`\ t`.对于如何编写一个意味着`\ t``PIPE-SYMBOL``\t`的ERE感到困惑的是OP.另外,使用`\ |`不起作用,因为字符串中指定的RE被解析两次,一次读取时再使用,所以你需要两次转义元字符,即`\\ |`. (2认同)