如何从管道分隔的文件中打印字段?
Posted
技术标签:
【中文标题】如何从管道分隔的文件中打印字段?【英文标题】:How do I print a field from a pipe-separated file? 【发布时间】:2010-09-17 20:24:28 【问题描述】:我有一个文件,其中的字段由管道字符分隔,我只想打印第二个字段。此尝试失败:
$ cat file | awk -F| 'print $2'
awk: syntax error near line 1
awk: bailing out near line 1
bash: print $2: command not found
有没有办法做到这一点?
【问题讨论】:
【参考方案1】:或者只使用一个命令:
cut -d '|' -f FIELDNUMBER
【讨论】:
请注意,问题的症结在于管道字符,而不是使用的命令。但这是一个很好的解决方案。 我想过,但我宁愿有一个解释问题的答案。事实上,这就是我评论的重点。 ;-) 应该是cut -d '|' -f FIELDNUMBER FILENAME
【参考方案2】:
这里的关键点是管道字符(|
)必须转义到shell。使用“\|
”或“'|'
”来保护它免受 shell 的干扰,并允许它在命令行上传递给awk
。
阅读 cmets 我看到原始海报提出了原始问题的简化版本,其中涉及在选择和打印字段之前过滤 file
。使用了通过grep
并将结果通过管道传输到 awk 以进行字段选择。这说明了问题中出现的完全不必要的cat file
(它取代了grep <pattern> file
)。
好的,那会起作用的。然而,awk 本身在很大程度上是一个模式匹配工具,无需调用grep
即可找到并处理匹配行。使用类似的东西:
awk -F\| '/<pattern>/print $2;next;' file
/<pattern>/
位告诉awk
在匹配<pattern>
的行上执行后续操作。
看起来丢失的next;
是跳到输入中的下一行的默认操作。好像没必要,不过我早就有这个习惯了……
【讨论】:
【参考方案3】:管道字符需要转义,以便 shell 不会解释它。一个简单的解决方案:
$ awk -F\| 'print $2' file
另一种选择是引用字符:
$ awk -F'|' 'print $2' file
【讨论】:
【参考方案4】:另一种使用 awk 的方式
awk 'BEGIN FS = "|" ; print $2 '
【讨论】:
【参考方案5】:并且“文件”不包含管道符号,因此它什么也不打印。您应该使用“cat 文件”或简单地在 awk 程序之后列出该文件。
【讨论】:
紧急。对于那个很抱歉。原始代码 grep 了一个文件,然后将输出通过管道传输到 awk。我清理了命令,但没有测试它。 :(以上是关于如何从管道分隔的文件中打印字段?的主要内容,如果未能解决你的问题,请参考以下文章
Bigquery - 在 CSV(联合表)中处理双引号和管道字段分隔符