我确信我曾经发现过一个shell命令,它可以从两个或多个文件中打印公共行。它叫什么名字?
它比diff简单多了。
我确信我曾经发现过一个shell命令,它可以从两个或多个文件中打印公共行。它叫什么名字?
它比diff简单多了。
当前回答
这不是你想问的,但我认为这对于描述一个稍微不同的场景还是有用的
如果你只是想快速确定一堆文件之间是否有重复的行,你可以使用这个快速解决方案:
cat a_bunch_of_files* | sort | uniq | wc
如果你得到的行数比你得到的少
cat a_bunch_of_files* | wc
然后是一些重复的线条。
其他回答
为了补充Perl的一行代码,下面是它在awk中的等价代码:
awk 'NR==FNR{arr[$0];next} $0 in arr' file1 file2
这将把file1中的所有行读入数组arr[],然后检查file2中的每一行是否已经存在于数组中(即file1)。找到的行将按照它们在file2中出现的顺序打印出来。 请注意,arr中的比较使用从file2开始的整行作为数组的索引,因此它只报告整行上的精确匹配。
你要找的命令是通讯
comm -12 1.sorted.txt 2.sorted.txt
在这里:
-1:删除列1 (1.sort .txt中唯一的行)
-2:删除列2 (2.sort .txt中唯一的行)
而
fgrep -v -f 1.txt 2.txt > 3.txt
给出了两个文件的区别(在2.txt和不在1.txt中的文件),你可以很容易地做一个
fgrep -f 1.txt 2.txt > 3.txt
收集所有公共行,这应该为您的问题提供一个简单的解决方案。如果你已经对文件进行了排序,你仍然应该使用通信。的问候!
注意:你可以用grep -F代替fgrep。
要轻松地将comm命令应用到未排序的文件,请使用Bash的进程替换:
$ bash --version
GNU bash, version 3.2.51(1)-release
Copyright (C) 2007 Free Software Foundation, Inc.
$ cat > abc
123
567
132
$ cat > def
132
777
321
因此,文件abc和def有一行相同的行,即带有“132”的行。 对未排序的文件使用comm:
$ comm abc def
123
132
567
132
777
321
$ comm -12 abc def # No output! The common line is not found
$
最后一行没有输出,公共行没有被发现。
现在使用comm对已排序的文件进行排序,使用进程替换对文件进行排序:
$ comm <( sort abc ) <( sort def )
123
132
321
567
777
$ comm -12 <( sort abc ) <( sort def )
132
现在我们到了132线!
这不是你想问的,但我认为这对于描述一个稍微不同的场景还是有用的
如果你只是想快速确定一堆文件之间是否有重复的行,你可以使用这个快速解决方案:
cat a_bunch_of_files* | sort | uniq | wc
如果你得到的行数比你得到的少
cat a_bunch_of_files* | wc
然后是一些重复的线条。