我的目标是将这两个文件合并为一个,如果第一个项目存在于第二个文件中,则先读取它,如果不只是复制,则更新它
- 第一个文件
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.txt
a.txt
a[$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