我有两个文件 file-1.txt 和 file-2.txt:
file-1.txt:
vim-id|name|salary|job
100|AAA|4000|MD
101|BBB|3500|Designer
102|CCC|3250|Designer
103|DDD|4500|MD
file-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 的内容。
示例输出:
file-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
最佳答案
您可以尝试使用此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}
跳过两个文件的 header 。FNR==NR {a[$1]=$0; next}
读取第一个文件,存储第一个字段作为索引的行。(a 中的 $1) {if (!b[$1]) print a[$1];打印; b[$1]++}
读取第二个文件时,检查第一个字段是否在存储的数组a[]
中,打印:- 如果该值尚未出现,则打印第一个文件中的相应行。
- 打印第二个文件中的当前行。
关于linux - 逐行比较两个文件并将匹配项移至第三个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26608313/