如何从文件中输出任何行,不包括在另一个文件中找到的行?

时间:2014-03-21 12:35:44

标签: bash

我需要通过匹配整行来输出file1.txt中除file2.txt中的所有行以外的所有行。

,例如file1.txt

Cats eat fish.
Mice eat cheese.
Eagles can fly.
Mountains are tall.

,例如file2.txt

Cats eat fish.
Birds can fly.
Trees are tall.

例如,输出:

Mice eat cheese.
Eagles fly.
Mountains are tall.

我使用了以下命令:

grep -v -x -f file1.txt file2.txt

这似乎有效,但是,当文件具有一定长度时,它通常会报告grep: memory exhausted,因此我需要一种不会产生此内存问题的替代方法。

  • 行的顺序很重要,因此不应对它们进行排序。
  • 通常在默认Linux安装中找到的任何工具都是可以接受的。

除了file1.txt中的file2.txt之外,如何输出{{1}}的行,而不会遇到内存问题?

2 个答案:

答案 0 :(得分:3)

尝试:

grep -Fxvf file2.txt file1.txt 

参考文献:find difference between two text files with one item per line

答案 1 :(得分:1)

尝试:

rm -f out.txt && while read -r line; do echo "checking if line $line exists in file2.txt"; if `grep -Fxq "$line" file2.txt`; then echo "$line exists in other for"; else echo "$line" >> out.txt; fi; done < file.txt

阐释:

这会删除输出文件(如果连续使用...),那么如果另一个存在则逐行检查。

作为bash文件,它更清楚:

rm out.txt
while read -r line
do
    echo "checking if line $line exists in file2.txt"
    if `grep -Fxq "$line" file2.txt`
    then
        echo "$line exists in other file"
    else 
        echo "$line" >> out.txt
    fi
done < file.txt

明显的概括:

while read -r line
do
    echo "checking if line $line exists in $2"
    if `grep -Fxq "$line" $2`
    then
        echo "$line exists in $2"
    else 
        echo "$line" >> $3
    fi
done < $1

第一个和第二个参数是文件,而outut文件是第三个参数