linux - 逐行比较两个文件并将匹配项移至第三个文件

标签 linux bash unix

我有两个文件 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/

相关文章:

bash - 在后台 Python 脚本完成之前防止关机/重启

linux - X11和gnome有什么关系?

linux - 将小于特定阈值的数字替换为零

linux - 从 jar 中提取 txt 文件

bash - 使用不带参数的 getopts 获取帮助输出

linux - 在 .lst 文件中的每一行的开头添加一个数字

linux - 强制程序将文件内容刷新到磁盘

html - Linux 中的 Unicode 字符 'BLACK DOWN-POINTING TRIANGLE' - CSS?

java - 找不到 WSDL2Java 类

linux - grep: grep -v 排除文件但不起作用