使用 AWK 将两个 txt 文件合并为一个并添加缺失的项目

使用 AWK 将两个 txt 文件合并为一个并添加缺失的项目

我的目标是将这两个文件合并为一个,如果第一个项目存在于第二个文件中,则先读取它,如果不只是复制,则更新它

  • 第一个文件a.txt
    AAA;2020-09-01;Y
    BBB;2020-09-01;Y
    CCC;2020-09-01;Y
    
  • 第二个文件b.txt
    AAA;2020-09-01;Y;21/08/2020
    BBB;2020-09-01;Y
    
  • 期望的结果c.txt
    AAA;2020-09-01;Y;21/08/2020
    BBB;2020-09-01;Y
    CCC;2020-09-01;Y
    

我尝试了这段代码,但结果缺少CCC原始数据,我该如何解决这个问题?

gawk -F, "FNR==NR{a[$1]=$1;next} $1 in a{$1=a[$1]} 1" OFS=, a.txt b.txt > c.txt

答案1

你的方法的问题是:

  • ,尽管您的文件是;- 分隔的,但您指定了作为字段分隔符
  • "您已将导致 shell 解释$1为位置参数而不是awk将其解释为字段的程序;您应该始终将awk程序用单引号引起来'
  • a您正在从构建“替换值列表”(存储在数组 中) a.txt,尽管您声明它应该基于b.txt
  • 您仅存储此列表中的第一个字段 ( ),而您应该存储从到 的a[$1]=$1副本的整行(即)。b.txta.txta[$1]=$0
  • 当“键”(第一项)出现在 中时b.txt,您仅将 的第一个字段替换a.txt为 中的相应行b.txt,尽管您应该替换整行(即$0=a[$1]代替$1=a[$1])。

所以看起来你正在寻找这样的东西:

gawk -F';' 'FNR==NR{a[$1]=$0; next} ($1 in a) {$0=a[$1]} 1' b.txt a.txt > c.txt

相关内容