我有两个非常大的文本文件,其中file2具有“更新和新项” 例如: 文件1:
itemA,ABC,123
itemB,,456
itemC,XYZ,789
文件2:
itemB,DEF,456
itemC,XYZ,567
itemD,321,ZYX
我希望最终输出为:
itemA,ABC,123
itemB,DEF,456
itemC,XYZ,567
itemD,321,ZYX
因此它将添加任何新行,但替换所有现有行的信息。 可以使用coreutils(连接,粘贴,合并等)完成此操作吗? 还是我最好将其加载到数据库中,执行INSERT / ON DUPLICATE KEY UPDATE并将其转储出去?
答案 0 :(得分:0)
我假设file2小于file1,因为它是“新的或更新的”记录。我还假设它足够小,可以舒适地容纳在内存中。
使用awk:基于字段1为唯一ID,此文件存储file2。
awk -F, '
NR == FNR {f2[$1] = $0; next}
$1 in f2 {print f2[$1]; delete f2[$1]; next}
1
END {for (key in f2) print f2[key]}
' file2 file1
输出
itemA,ABC,123
itemB,DEF,456
itemC,XYZ,567
itemD,321,ZYX
它只是被排序了,如果对您很重要,您可能希望将输出通过管道传输到sort
。
这是join
和awk的版本:join要求对输入文件进行排序
$ join -t, -a1 -a2 <(sort file1) <(sort file2) | awk -F, -v OFS=, '{print $1, $(NF-1), $NF}'
itemA,ABC,123
itemB,DEF,456
itemC,XYZ,567
itemD,321,ZYX