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

问题描述 投票:6回答:5

我有一个文件,其字段由竖线字符分隔,我只想打印第二个字段。尝试失败:

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

有没有办法做到这一点?

bash unix shell awk ksh
5个回答
9
投票

这里的关键是必须将竖线字符(|)转义到外壳。使用“ \|”或“ '|'”可以防止它受到外壳程序的干扰,并允许在命令行上将其传递给awk


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

很好,那会起作用。但是,awk在很大程度上本身就是一种模式匹配工具,可以被信任地找到并在匹配行上工作,而无需调用grep。使用类似:

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

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

看起来很丢人的{next;}是默认操作,跳到输入的下一行。似乎没有必要,但是我很早以前就有这个习惯...


18
投票

或仅使用一个命令:

cut -d '|' -f FIELDNUMBER

3
投票

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

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

另一个选择是引用字符:

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

0
投票

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


0
投票

使用awk的另一种方法

awk 'BEGIN { FS = "|" } ; { print $2 }'
© www.soinside.com 2019 - 2024. All rights reserved.