比较脚本中的两个文件

比较脚本中的两个文件
#!/bin/bash
while read file1 <&3; do
     while read file2 ; do       
        if [ $file1 == $file2 ] ; then
         $file1 >> /infanass/dev/admin/test/newlist.txt
        fi
    echo "$file1"
    echo "$file2"
 done 3</infanass/dev/admin/test/file2.txt
done 3</infanass/dev/admin/test/file1.txt

我想从 file1.txt 读取一行,然后循环遍历 file2.txt 并查看是否有匹配项,以及是否也将其写出一个新的文本文件。

我想我有一个无限循环..

答案1

更简单的方法怎么样?

while read line do
    grep "^$line$" file2.txt >>matches.txt
done < file1.txt

解释:

这会逐行file1.txt循环并用于grep查找 中的确切行file2.txtgrep如果能够匹配该行,现在将再次输出该行file2.txt,然后将其重定向(附加)到文件matches.txt

您的脚本停滞的原因是您的第二个循环正在等待输入stdin:您忘记将其stdin复制为文件描述符3,就像对第一个循环所做的那样。在任何情况下,都不需要创建额外的文件描述符:您只需重定向,stdin以便while循环从文件而不是终端读取。

答案2

使用comm找到交点:

comm -12 <(sort file1.txt) <(sort file2.txt) > newlist.txt

comm 要求对其输入文件进行排序。

答案3

为什么不通过喂食来更简单地做到这一点文件1作为 grep 的搜索词并让它在其中搜索文件2

$ grep -f file1 file2 > file3

请注意,在某些平台上,由于性能问题,您需要/想要 egrep 或 ggrep。

相关内容