逐行比较两个文件并将匹配移动到第三个文件

时间:2014-10-28 12:24:50

标签: linux bash unix

我有两个文件file-1.txt和file-2.txt:

文件-1.txt的

vim-id|name|salary|job
100|AAA|4000|MD
101|BBB|3500|Designer
102|CCC|3250|Designer
103|DDD|4500|MD

文件-2.txt

vim-id|product|version
101|BOB|2.0
101|CAT|2.1
101|CAT|2.5
102|MICRO|5.1
102|SOFT|7.5

我需要比较列值(例如vim-id),如果两个文件中都匹配vim-id,请将相关行移动到不同的文件: file-3.txt 。我们应该首先添加 file-1.txt 的内容,然后添加 file-2.txt 的内容。

示例输出:

文件-3.txt

101|BBB|3500|Designer
101|BOB|2.0
101|CAT|2.1
101|CAT|2.5
102|CCC|3250|Designer
102|MICRO|5.1
102|SOFT|7.5

注意:这是一个例子。我有大量要处理的文件。

你能帮助我吗?比较缓慢,这就是我问你的原因。

以下是我的代码:

while read line
do
        for i in `echo $line | cut -d '|' -f'1'`
        do
       if grep -q "$i" file-2.txt  ; then
                echo $line >> file-3.txt
                grep -i "$i" file-2.txt  >> file-3.txt
        fi
        break
        done
done < file-1.txt

1 个答案:

答案 0 :(得分:0)

您可以尝试使用此awk

$ awk -v FS="|" 'FNR==1 {next} FNR==NR {a[$1]=$0; next} ($1 in a) {if (!b[$1]) print a[$1]; print; b[$1]++}' f1 f2
101|BBB|3500|Designer
101|BOB|2.0
101|CAT|2.1
101|CAT|2.5
102|CCC|3250|Designer
102|MICRO|5.1
102|SOFT|7.5

解释

  • -v FS="|"将字段分隔符设置为|
  • FNR==1 {next}跳过两个文件的标题。
  • FNR==NR {a[$1]=$0; next}读取第一个文件,以第一个字段作为索引存储行。
  • ($1 in a) {if (!b[$1]) print a[$1]; print; b[$1]++}在阅读第二个文件时,检查第一个字段是否在存储的数组a[]中,打印:
    • 如果该值尚未显示,请从第一个文件中打印相应的行。
    • 在第二个文件中打印当前行。