在两个不同的文件中显示重复的行

时间:2013-03-26 19:33:24

标签: linux bash

我有两个文件,我想显示重复的行。我尝试了这个,但它不起作用:

cat id1.txt | while read id; do grep "$id" id2.txt; done

我想知道是否有其他方法可以在文件中显示重复的行。 我的两个文件都包含id列表。 谢谢。

4 个答案:

答案 0 :(得分:13)

文件是否排序?它们可以分类吗?

如果已排序:

comm -12 id1.txt id2.txt

如果没有排序但使用bash 4.x:

comm -12 <(sort id1.txt) <(sort id2.txt)

如果您没有bash 4.x和'process substitution',则有使用临时文件的解决方案。

您也可以使用grep -F

grep -F -f id1.txt id2.txt

这会查找id1.txt中显示的id2.txt中的字词。这里唯一的问题是确保ID 1与某个地方包含1的每个ID都不匹配。某些版本的grep中提供的-w-x选项可在此处使用。

答案 1 :(得分:10)

如果检测到重复是指两个文件中存在的打印行(或在一个文件中重复),则可以使用uniq

$ cat file1 file2 | sort | uniq -d

答案 2 :(得分:2)

您可以改为使用comm命令:

sort id1.txt > id1.txt.sorted
sort id2.txt > id2.txt.sorted
comm -12 id1.txt.sorted id2.txt.sorted

如果您想在一个命令中执行此操作:

comm -12 <(sort id1.txt) <(sort id2.txt)

comm的参数:

  • -1参数会抑制第一个文件中唯一的行。
  • -2参数会抑制第二个文件中唯一的行。
  • 如果您传递-3参数,则会抑制公共线。

答案 3 :(得分:0)

使用 awk 可以节省您的时间。

awk 'FNR==NR{lines[$0]=1;next} $0 in lines' id1.txt id2.txt