如何从管道分隔文件中打印字段?

时间:2008-10-17 21:06:50

标签: bash unix shell awk ksh

我有一个文件,其中的字段用竖线字符分隔,我想只打印第二个字段。这种尝试失败了:

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

有办法做到这一点吗?

5 个答案:

答案 0 :(得分:18)

或者只使用一个命令:

cut -d '|' -f FIELDNUMBER

答案 1 :(得分:9)

这里的关键点是管道符(|)必须转义到shell。使用“\|”或“'|'”来保护它免受shell干涉,并允许它在命令行上传递给awk


阅读评论我看到原始海报提供了原始问题的简化版本,其中涉及在选择和打印字段之前过滤file。使用了通过grep并将结果通过管道传输到awk以进行字段选择。这说明了问题中出现的完全不必要的cat file(它取代了grep <pattern> file)。

很好,那会有用。但是,awk本身就是一个模式匹配工具,可以信任查找和处理匹配的行,而无需调用grep。使用类似的东西:

awk -F\| '/<pattern>/{print $2;}{next;}' file

/<pattern>/位告诉awk执行与<pattern>匹配的行后面的操作。

丢失的{next;}是跳过输入中下一行的默认操作。它似乎没有必要,但我很久以前就有这个习惯......

答案 2 :(得分:3)

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

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

另一个选择是引用这个角色:

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

答案 3 :(得分:1)

使用awk的另一种方法

awk 'BEGIN { FS = "|" } ; { print $2 }'

答案 4 :(得分:0)

'file'不包含管道符号,因此不打印任何内容。你应该使用'cat file'或者只是在awk程序之后列出文件。