我遇到了AWK的字段分隔符问题,
输入文件如下所示
1 | all | | 同义词 | 1 | root | | 科学名称 | 2 | Bacteria | Bacteria | 科学名称 | 2 | Monera | Monera | 部分内容 | 2 | Procaryotae | Procaryotae | 部分内容 | 2 | Prokaryota | Prokaryota | 部分内容 | 2 | Prokaryotae | Prokaryotae | 部分内容 | 2 | bacteria | bacteria | 爆炸名字 |
这里的字段分隔符是制表符,管道符号,制表符
而不是期望的输出,输出结果是第一列后跟着一个竖杠。我尝试转义这个竖杠
1 | all | | 同义词 | 1 | root | | 科学名称 | 2 | Bacteria | Bacteria | 科学名称 | 2 | Monera | Monera | 部分内容 | 2 | Procaryotae | Procaryotae | 部分内容 | 2 | Prokaryota | Prokaryota | 部分内容 | 2 | Prokaryotae | Prokaryotae | 部分内容 | 2 | bacteria | bacteria | 爆炸名字 |
这里的字段分隔符是制表符,管道符号,制表符
\t | \ t
因此,在尝试仅打印第1列和第2列时awk -F'\t|\t' '{print $1 "\t" $2}' nodes.dmp | less
而不是期望的输出,输出结果是第一列后跟着一个竖杠。我尝试转义这个竖杠
\t\|\t
,但输出结果仍然相同。
打印第一列和第三列,可以得到最初预期的输出结果。1 |
1 |
2 |
2 |
2 |
2 |
awk -F'\t|\t' '{print $1 "\t" $3}' nodes.dmp | less
但我很困惑为什么这不像预期的那样工作。
我知道下面的perl一行代码可以工作,但我真正想要的是使用awk。
perl -aln -F"\t\|\t" -e 'print $F[0],"\t",$F[1]' nodes.dmp | less
\|
并且在类似上面示例的情况下,[]是转义元字符的首选方式吗? - Buthetleon[]
中的任何内容都表示一个字符类,并按原样解释。当然,您也可以通过输入\|
来转义|
,这也可以起作用。不过,使用[|]
看起来更加清晰。 - devnull\t|\t
不会让awk感到困惑;awk完全理解它的意思,即FS是\t
或\t
。混淆的是OP对如何编写表示\t PIPE-SYMBOL \t
的ERE感到困惑。此外,使用\|
也行不通,因为在字符串中指定的正则表达式会被解析两次,一次在读取时,一次在使用时,所以您需要两次转义元字符,即\\|
。 - Ed Mortonawk -F'\t\\|\t' '{print $1 "\t" $2}'
对我来说是有效的,但实际上,使用字符类更容易阅读。 - Adrian Frühwirth