我确信我曾经发现过一个shell命令,它可以从两个或多个文件中打印公共行。它叫什么名字?
它比diff简单多了。
我确信我曾经发现过一个shell命令,它可以从两个或多个文件中打印公共行。它叫什么名字?
它比diff简单多了。
当前回答
有关如何为多个文件执行此操作,请参阅跨多个文件查找匹配行的链接答案。
结合这两个答案(答案1和答案2),我认为你可以得到你需要的结果,而不需要对文件进行排序:
#!/bin/bash
ans="matching_lines"
for file1 in *
do
for file2 in *
do
if [ "$file1" != "$ans" ] && [ "$file2" != "$ans" ] && [ "$file1" != "$file2" ] ; then
echo "Comparing: $file1 $file2 ..." >> $ans
perl -ne 'print if ($seen{$_} .= @ARGV) =~ /10$/' $file1 $file2 >> $ans
fi
done
done
只需保存它,赋予它执行权限(chmod +x compareFiles.sh)并运行它。它将获取当前工作目录中的所有文件,并进行all-vs-all比较,将结果留在“matching_lines”文件中。
需要改进的地方:
跳过目录 避免将所有文件进行两次比较(file1 vs file2和file2 vs file1)。 可以在匹配的字符串旁边添加行号
其他回答
awk 'NR==FNR{a[$1]++;next} a[$1] ' file1 file2
你要找的命令是通讯
comm -12 1.sorted.txt 2.sorted.txt
在这里:
-1:删除列1 (1.sort .txt中唯一的行)
-2:删除列2 (2.sort .txt中唯一的行)
这不是你想问的,但我认为这对于描述一个稍微不同的场景还是有用的
如果你只是想快速确定一堆文件之间是否有重复的行,你可以使用这个快速解决方案:
cat a_bunch_of_files* | sort | uniq | wc
如果你得到的行数比你得到的少
cat a_bunch_of_files* | wc
然后是一些重复的线条。
如果这两个文件还没有排序,你可以使用:
comm -12 <(sort a.txt) <(sort b.txt)
它将工作,避免错误消息comm: file 2不是有序的 当执行comm -12 a.t xxb .txt时。
也许你指的是通讯?
逐行比较排序文件FILE1和FILE2。 在没有选项的情况下,生成三列输出。列一个 包含FILE1列特有的行 Two包含唯一的行 FILE2和第三列包含两个文件的公共行。
找到这些信息的秘密是信息页。对于GNU程序,它们比手册页要详细得多。尝试info coreutils,它会列出所有有用的小utils。