我确定我曾经发现一个unix命令可以打印两个或多个文件中的公共行,有人知道它的名字吗?这比简单得多diff
.
你正在寻找的命令是comm
.例如:-
comm -12 1.sorted.txt 2.sorted.txt
这里:
-1:禁止第1列(1.sorted.txt唯一的行)
-2:抑制第2列(2.sorted.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线!
为了补充Perl单线程,这是它的awk
等价物:
awk 'NR==FNR{arr[$0];next} $0 in arr' file1 file2
这将读取所有行file1
到数组中arr[]
,然后检查每一行file2
是否已存在于数组中(即file1
).找到的行将按其出现的顺序打印file2
.请注意,比较in arr
使用从file2
索引到数组的整行,因此它只会在整行上报告完全匹配.
也许你的意思comm
?
逐行比较已排序的文件FILE1和FILE2.
没有选项,产生三列输出.第一列包含FILE1特有的行,第二列包含FILE2特有的行,第三列包含两个文件共有的行.
查找这些信息的秘诀是信息页面.对于GNU程序,它们比人工页面更详细.尝试info coreutils
它会列出所有小的有用的工具.
而
grep -v -f 1.txt 2.txt > 3.txt
给你两个文件的差异(2.txt中的内容,而不是1.txt中的内容),你可以很容易地做到
grep -f 1.txt 2.txt > 3.txt
收集所有常见的行,这应该为您的问题提供简单的解决方案.如果你有文件,你应该采取comm
.问候!
perl -ne 'print if ($seen{$_} .= @ARGV) =~ /10$/' file1 file2
如果这两个文件尚未排序,则可以使用:
comm -12 <(sort a.txt) <(sort b.txt)
它将起作用,避免comm: file 2 is not in sorted order
这样做时出现错误消息comm -12 a.txt b.txt
。
awk 'NR==FNR{a[$1]++;next} a[$1] ' file1 file2