【问题标题】:Why does NR==FRN; {} behave differently when used as NR==FNR{ }?为什么 NR==FRN; {} 在用作 NR==FNR{ } 时表现不同?
【发布时间】:2022-06-10 17:20:56
【问题描述】:

希望有人可以帮助解释以下awk 输出。
awk --version:GNU Awk 5.0.1,API:2.0(GNU MPFR 4.0.2,GNU MP 6.2.0)
操作系统:Windows上的Linux子系统; Linux Windows11x64 5.10.102.1-microsoft-standard-WSL2
用户体验:n00b

重要:在下面的两个代码sn-ps中,唯一的区别是示例#2中NR==FNR后面的分号(;)。

样本 #1 'awk 'NR==FNR { print $0 }' lines_to_show.txt all_lines.txt
输出 #1
2
3
4
5
7

样本 #2 'awk 'NR==FNR; { print $0 }' lines_to_show.txt all_lines.txt
输出#2
2 # 为什么文件 'lines_to_show.txt 中的值出现两次?
2
3
3
4
4
5
5
7
7
线 -01
线 -02
第-03行
第-04行
线 -05
第-06行
第-07行
第-08行
第-09行
第-10行

生成文本输入文件
lines_to_show.txtecho -e "2\n3\n4\n5\n7" > lines_to_show.txt
all_lines.txtecho -e "line\t-01\nline\t-02\nline\t-03\nline\t-04\nline\t-05\nline\t-06\nline\t-07\nline\t-08\nline\t-09\nline\t-10" > all_lines.txt

请求/问题

  • 如果您能解释一下为什么您知道以下问题的答案(经验、教程、视频等)。
  • 如何阅读“awk”程序?我的印象是分号 ( ; ) 只是一个语句终止符,就像在 C 中一样。它不应该对程序的执行产生影响。
  • 在输出 #2 中,为什么文件 'lines_to_show.txt 中的值出现两次?似乎awk 正在打印第一个文件“lines_to_show.txt”中的值,但打印了 10 次,这是文件“all_lines.txt”中的记录数。这是真的?为什么?
  • 为什么在输出#1 中只显示“lines_to_show.txt”的输出?我以为awk 会处理每个文件中的每条记录,所以我预计会看到 15 行 (10 + 5)。

到目前为止我尝试了什么?

  1. 通过https://www.linkedin.com/learning/awk-essential-training/using-awk-command-line-flags?autoSkip=true&autoplay=true&resume=false&u=61697657
  2. 修改代码以查看差异并使用它来“了解”正在发生的事情。
  3. 尝试使用笔和纸完成流程
  4. 通过https://www.baeldung.com/linux/awk-multiple-input-files --> https://www.baeldung.com/linux/awk-multiple-input-files

【问题讨论】:

标签: awk


【解决方案1】:
awk 'NR==FNR { print $0 }' lines_to_show.txt all_lines.txt

这里有一个模式-动作对,即如果(总)行数等于文件行数,则打印整行。

awk 'NR==FNR; { print $0 }' lines_to_show.txt all_lines.txt

这里有两个模式-动作对,因为; 遵循条件,所以假设您想要默认动作,即{print $0},换句话说,相当于

awk 'NR==FNR{print $0}{ print $0}' lines_to_show.txt all_lines.txt

第一个 print $0 仅在处理第一个文件时使用,第二个 print $0 不加区别地使用(没有给出条件),因此对于 lines_to_show.txt 两个 prints 都使用,对于 all_lines.txt 仅第二个 print .

【讨论】:

  • “模式动作”还是“条件规则”? (不管怎样,我知道你的意思:)
  • @DavidC.Rankin 我使用 patternactionThe GNU Awk User's Guide do 含义相同
  • 我不得不阅读答案几次,但现在我明白发生了什么。谢谢! @Daweo。抱歉,我没有足够的积分,无法投票。
  • @Daweo - 这没什么错,你已经得到了我的投票。该手册始终是正确的,尽管“条件”和“规则”的常用术语可能更具描述性。例如。虽然正则表达式是一种模式,但很难将NR == 1n > 2 等称为模式。很好地引用了手册。
【解决方案2】:

man awk 是最好的参考:

An awk program is composed of pairs of the form:

pattern { action }

Either the pattern or the action (including the
enclosing brace characters) can be omitted.

A missing pattern shall match any record of input,
and a missing action shall be equivalent to:

{ print }

; 终止一个模式动作块。所以你有两个模式/动作块,它们的动作是打印线。

【讨论】:

    猜你喜欢
    • 2015-12-05
    • 2017-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-21
    • 1970-01-01
    • 1970-01-01
    • 2015-12-29
    相关资源
    最近更新 更多