如果值存在,请使用linux join命令更新文本文件中的字段

时间:2019-03-06 17:15:42

标签: join text-processing gnu-coreutils

我有两个非常大的文本文件,其中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并将其转储出去?

1 个答案:

答案 0 :(得分:0)

我假设file2小于file1,因为它是“新的或更新的”记录。我还假设它足够小,可以舒适地容纳在内存中。

使用awk:基于字段1为唯一ID,此文件存储file2。

  • 如果字段1同时出现在文件1和文件2中,则将打印文件2记录。
  • 如果字段1仅出现在文件1中,则会打印该记录。
  • 在处理文件1之后,将打印文件2中所有未出现在文件1中的记录。
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