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

问题描述 投票:0回答:1

我有两个非常大的文本文件,其中file2有“更新和新项目”例如:file1:

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并将其转储出去?

join text-processing gnu-coreutils
1个回答
0
投票

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

使用awk:这将存储file2,基于字段1是唯一ID。

  • 如果字段1同时出现在file1和file2中,则打印file2记录。
  • 如果字段1仅出现在file1中,则打印该记录。
  • 处理完file1后,将打印file2中未出现在file1中的所有记录。
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
© www.soinside.com 2019 - 2024. All rights reserved.