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

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

/&lt;pattern&gt;/ 位告诉awk 在匹配&lt;pattern&gt; 的行上执行后续操作。

看起来丢失的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。我清理了命令,但没有测试它。 :(

以上是关于如何从管道分隔的文件中打印字段?的主要内容,如果未能解决你的问题,请参考以下文章

在python中解析管道分隔文件

从管道分隔文件中获取值

Bigquery - 在 CSV(联合表)中处理双引号和管道字段分隔符

RegExp 从管道分隔的字符串中提取值

使用连接(codeigniter)从单个字段中检索和打印逗号分隔符后的值

不可打印的字符未被识别为字段分隔符