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

发布于 2024-07-07 03:37:51 字数 223 浏览 8 评论 0原文

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

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

有办法做到这一点吗?

I have a file with fields separated by pipe characters and I want to print only the second field. This attempt fails:

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

Is there a way to do this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

何其悲哀 2024-07-14 03:37:51

或者只使用一个命令:

cut -d '|' -f FIELDNUMBER

Or just use one command:

cut -d '|' -f FIELDNUMBER
初熏 2024-07-14 03:37:51

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


阅读评论,我发现原始海报提出了原始问题的简化版本,其中涉及在选择和打印字段之前过滤文件。 使用了 grep 传递,并将结果通过管道传输到 awk 中进行字段选择。 这就解释了问题中出现的完全不必要的 cat 文件(它替换了 grep文件)。

好吧,那会起作用的。 然而,awk 本身在很大程度上是一个模式匹配工具,可以信任它可以查找并处理匹配行,而无需调用 grep。 使用如下内容:

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

// 位告诉 awk 在匹配 的行上执行后续操作。

看起来丢失的 {next;} 是跳到输入中的下一行的默认操作。 好像没有必要,但是我很久以前就有这个习惯了……

The key point here is that the pipe character (|) must be escaped to the shell. Use "\|" or "'|'" to protect it from shell interpertation and allow it to be passed to awk on the command line.


Reading the comments I see that the original poster presents a simplified version of the original problem which involved filtering file before selecting and printing the fields. A pass through grep was used and the result piped into awk for field selection. That accounts for the wholly unnecessary cat file that appears in the question (it replaces the grep <pattern> file).

Fine, that will work. However, awk is largely a pattern matching tool on its own, and can be trusted to find and work on the matching lines without needing to invoke grep. Use something like:

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

The /<pattern>/ bit tells awk to perform the action that follows on lines that match <pattern>.

The lost-looking {next;} is a default action skipping to the next line in the input. It does not seem to be necessary, but I have this habit from long ago...

梦回旧景 2024-07-14 03:37:51

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

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

另一种选择是引用该字符:

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

The pipe character needs to be escaped so that the shell doesn't interpret it. A simple solution:

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

Another choice would be to quote the character:

$ awk -F'|' '{print $2}' file
不醒的梦 2024-07-14 03:37:51

使用 awk 的另一种方法

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

Another way using awk

awk 'BEGIN { FS = "|" } ; { print $2 }'
递刀给你 2024-07-14 03:37:51

并且“文件”不包含管道符号,因此它不打印任何内容。 您应该使用“cat file”或简单地在 awk 程序后面列出该文件。

And 'file' contains no pipe symbols, so it prints nothing. You should either use 'cat file' or simply list the file after the awk program.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文