我确信我曾经发现过一个shell命令,它可以从两个或多个文件中打印公共行。它叫什么名字?
它比diff简单多了。
我确信我曾经发现过一个shell命令,它可以从两个或多个文件中打印公共行。它叫什么名字?
它比diff简单多了。
当前回答
你要找的命令是通讯
comm -12 1.sorted.txt 2.sorted.txt
在这里:
-1:删除列1 (1.sort .txt中唯一的行)
-2:删除列2 (2.sort .txt中唯一的行)
其他回答
perl -ne 'print if ($seen{$_} .= @ARGV) =~ /10$/' file1 file2
也许你指的是通讯?
逐行比较排序文件FILE1和FILE2。 在没有选项的情况下,生成三列输出。列一个 包含FILE1列特有的行 Two包含唯一的行 FILE2和第三列包含两个文件的公共行。
找到这些信息的秘密是信息页。对于GNU程序,它们比手册页要详细得多。尝试info coreutils,它会列出所有有用的小utils。
如果这两个文件还没有排序,你可以使用:
comm -12 <(sort a.txt) <(sort b.txt)
它将工作,避免错误消息comm: file 2不是有序的 当执行comm -12 a.t xxb .txt时。
要轻松地将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线!
在受限版本的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