我遇到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)
管道|性格似乎是混乱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)