我有一个由管道字符分隔的字段的文件,我只想打印第二个字段。此尝试失败:
$ cat file | awk -F| '{print $2}'
awk: syntax error near line 1
awk: bailing out near line 1
bash: {print $2}: command not found
有没有办法做到这一点?
或者只使用一个命令:
cut -d '|' -f FIELDNUMBER
这里的关键点是管道字符 ( |
) 必须转义到 shell。使用 " \|
" 或 " '|'
" 来保护它免受 shell 的干扰,并允许它awk
在命令行上传递。
阅读评论我看到原始海报提出了原始问题的简化版本,其中涉及file
在选择和打印字段之前进行过滤。使用了通过grep
,并将结果通过管道传输到 awk 以进行字段选择。这解释了问题中出现的完全不必要cat file
的内容(它取代了grep <pattern> file
)。
好吧,那会奏效的。但是,awk 本身在很大程度上是一个模式匹配工具,可以信任它来查找和处理匹配的行,而无需调用grep
. 使用类似的东西:
awk -F\| '/<pattern>/{print $2;}{next;}' file
该/<pattern>/
位告诉awk
在匹配的行上执行以下操作<pattern>
。
lost-looking{next;}
是跳到输入中的下一行的默认操作。好像没必要,不过我早就有这个习惯了……
管道字符需要转义,以便 shell 不会解释它。一个简单的解决方案:
$ awk -F\| '{print $2}' file
另一种选择是引用字符:
$ awk -F'|' '{print $2}' file
使用 awk 的另一种方法
awk 'BEGIN { FS = "|" } ; { print $2 }'
并且“文件”不包含管道符号,因此它什么也不打印。您应该使用“cat 文件”或简单地在 awk 程序之后列出该文件。