【问题标题】:AWK getline example , please explain the output?AWK getline 例子,请解释一下输出?
【发布时间】:2017-05-01 07:22:30
【问题描述】:

我在 getline 中找到了这个 awk 示例,但无法理解它是如何工作的。

seq 5 | awk 'BEGIN { getline; print "Read ahead first line", $0 } {print $0 }'

输出是:

Read ahead first line 1
2
3
4
5

【问题讨论】:

  • 感谢 Sundeep 编辑问题
  • 不客气...请参阅stackoverflow.com/editing-help 以备将来使用...此外,您可以标记对您最有帮助的答案...

标签: bash awk


【解决方案1】:

seq 5 产生

1
2
3
4
5

awkBEGIN 块在主块之前执行。
getline 读取一行,在BEGIN 块中打印为$0
然后主块读取剩余的行。

$ seq 5 | awk 'BEGIN { getline; print "BEGIN read", $0} {print "main read", $0 }'
BEGIN read 1
main read 2
main read 3
main read 4
main read 5

【讨论】:

  • 混淆是 getline 并在开始时打印 $0。感谢您的回答。它非常有用@molbdnilo
【解决方案2】:
seq 5 | awk 'BEGIN { getline; print "Read ahead first line", $0 } {print $0 }'

seq 5 你会得到

$ seq 5
1
2
3
4
5

BEGIN { getline; print "Read ahead first line", $0 },awk 将从stdin 读取第一条记录,即1

通过管道seq 5 | awk '{...}' (first program | second program)
管道用于将流从一个程序重定向到另一个程序。当一个程序的标准输出通过管道发送到另一个程序时

$ seq 5 | awk 'BEGIN { getline; print "Read ahead first line", $0 }'
Read ahead first line 1

{print $0 } 在 BEGIN 块之后将读取剩余的 2 到 5 记录,这是在 BEGIN 块内不打印的方法

$ seq 5 | awk 'BEGIN { getline} {print $0}'
2
3
4
5

【讨论】:

  • @rachnagarg 虽然 Akshay 很好地解释了该代码的语义,但我只是想确保您明确永远不会真正编写该代码。如果您考虑过使用getline,请务必先阅读并完全理解awk.freeshell.org/AllAboutGetline
猜你喜欢
  • 2021-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-17
相关资源
最近更新 更多