11

我有一个由管道字符分隔的字段的文件,我只想打印第二个字段。此尝试失败:

$ cat file | awk -F| '{print $2}'
awk: syntax error near line 1
awk: bailing out near line 1
bash: {print $2}: command not found

有没有办法做到这一点?

4

5 回答 5

21

或者只使用一个命令:

cut -d '|' -f FIELDNUMBER
于 2008-10-17T21:13:31.047 回答
10

这里的关键点是管道字符 ( |) 必须转义到 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;}是跳到输入中的下一行的默认操作。好像没必要,不过我早就有这个习惯了……

于 2008-10-17T21:29:55.787 回答
4

管道字符需要转义,以便 shell 不会解释它。一个简单的解决方案:

$ awk -F\| '{print $2}' file

另一种选择是引用字符:

$ awk -F'|' '{print $2}' file
于 2008-10-17T21:06:56.800 回答
1

使用 awk 的另一种方法

awk 'BEGIN { FS = "|" } ; { print $2 }'
于 2020-03-06T00:46:50.257 回答
0

并且“文件”不包含管道符号,因此它什么也不打印。您应该使用“cat 文件”或简单地在 awk 程序之后列出该文件。

于 2008-10-17T21:23:28.857 回答