【问题标题】:Command for comparing two files with awk only returns last line for each match用 awk 比较两个文件的命令只返回每个匹配的最后一行
【发布时间】:2020-11-10 00:20:26
【问题描述】:

我有一个 bash 命令$ awk 'NR==FNR {a[$1]=$0;}; $1 in a {print a[$1]}' file1 file2 > outputfile

file1 的结构如下:

'resource/Autism' 'type' 'owl#Thing' .  
'resource/Alabama' 'type' 'AdministrativeArea' .  
'resource/Alabama' 'type' 'Region' .  

file2 的结构如下:

'resource/Alabama'  
'resource/Abert_Einstein'  
'resource/Autism'

我现在希望我的命令将“file2”中的条目与“file1”第一列的条目进行比较,如果匹配,则在“outputfile”中打印“file1”的整行。 例如,如果我在“file2”中有“resource/Alabama”行,它应该打印“file1”的每一行,其中第一列等于“resource/Alabama”。 但是,我的命令只打印找到“resource/Alabama”的最后一行。

谁能解释一下我做错了什么?

非常感谢! 问候,斯文

【问题讨论】:

  • 交换输入文件的顺序-awk '...' file2 file。想想吧。
  • ...如果您不知道为什么这是解决方案,请随时在这里提问。
  • 别忘了告诉我们你的尝试,我觉得这样更好。
  • @edMorton 成功了!我以为我之前尝试过更改输入文件的顺序,但显然我没有。我还必须将{print a[$1]} 更改为{print $0},是的@thanasip 很抱歉我忘记了next 语句,但我的原始命令包含它。

标签: bash awk git-bash


【解决方案1】:

完整的解决方案:

awk 'NR==FNR{a[$1]; next} $1 in a' file2 file1

【讨论】:

    【解决方案2】:

    当然,您可以使用 awk 来实现,但您也可以尝试 join,我认为这正是您想要的。

    试试:

    join <(sort file2.txt) <(sort file1.txt)
    

    它正在使用joinprocess substitution

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-30
      • 2014-02-20
      • 1970-01-01
      • 2018-10-25
      • 1970-01-01
      • 1970-01-01
      • 2021-06-15
      相关资源
      最近更新 更多