我确信我曾经发现过一个shell命令,它可以从两个或多个文件中打印公共行。它叫什么名字?

它比diff简单多了。


当前回答

这不是你想问的,但我认为这对于描述一个稍微不同的场景还是有用的

如果你只是想快速确定一堆文件之间是否有重复的行,你可以使用这个快速解决方案:

cat a_bunch_of_files* | sort | uniq | wc

如果你得到的行数比你得到的少

cat a_bunch_of_files* | wc

然后是一些重复的线条。

其他回答

fgrep -v -f 1.txt 2.txt > 3.txt

给出了两个文件的区别(在2.txt和不在1.txt中的文件),你可以很容易地做一个

fgrep -f 1.txt 2.txt > 3.txt

收集所有公共行,这应该为您的问题提供一个简单的解决方案。如果你已经对文件进行了排序,你仍然应该使用通信。的问候!

注意:你可以用grep -F代替fgrep。

rm file3.txt

cat file1.out | while read line1
do
        cat file2.out | while read line2
        do
                if [[ $line1 == $line2 ]]; then
                        echo $line1 >>file3.out
                fi
        done
done

这个应该可以了。

为了补充Perl的一行代码,下面是它在awk中的等价代码:

awk 'NR==FNR{arr[$0];next} $0 in arr' file1 file2

这将把file1中的所有行读入数组arr[],然后检查file2中的每一行是否已经存在于数组中(即file1)。找到的行将按照它们在file2中出现的顺序打印出来。 请注意,arr中的比较使用从file2开始的整行作为数组的索引,因此它只报告整行上的精确匹配。

在受限版本的Linux上(比如我正在开发的QNAP (NAS)):

Comm并不存在 正如@ChristopherSchultz所说,grep -f -f file1 file2可能会导致一些问题,使用grep -f -f file1 file2真的很慢(超过5分钟-没有完成-在超过20mb的文件上使用下面的方法超过2-3秒)

这就是我所做的:

sort file1 > file1.sorted
sort file2 > file2.sorted

diff file1.sorted file2.sorted | grep "<" | sed 's/^< *//' > files.diff
diff file1.sorted files.diff | grep "<" | sed 's/^< *//' > files.same.sorted

如果files.same.sorted应该与原始文件的顺序相同,那么添加这一行与file1的顺序相同:

awk 'FNR==NR {a[$0]=$0; next}; $0 in a {print a[$0]}' files.same.sorted file1 > files.same

或者,对于与file2相同的顺序:

awk 'FNR==NR {a[$0]=$0; next}; $0 in a {print a[$0]}' files.same.sorted file2 > files.same

如果这两个文件还没有排序,你可以使用:

comm -12 <(sort a.txt) <(sort b.txt)

它将工作,避免错误消息comm: file 2不是有序的 当执行comm -12 a.t xxb .txt时。