如何在unix中找到3个不同文件的匹配记录

时间:2014-03-11 15:36:15

标签: shell unix sed awk

我有3个不同的文件。 Test1.txt,Test2.txt& Test3.txt

Test1.txt 包含

JJTP@yahoo.com
BBMU@ssc.com
HK@glb.com

Test2.txt 包含

SFTY@gmail.com
JJTP@yahoo.com

Test3.txt 包含

JJTP@yahoo.com
HK@glb.com

我想在这3个文件中只看到匹配的记录。

所以上面例子中的匹配记录将是JJTP@yahoo.com 输出应为

JJTP@yahoo.com

5 个答案:

答案 0 :(得分:3)

如果您在每个文件中没有重复的行,那么:

$ awk '++a[$1]==3' test[1-3]
JJTP@yahoo.com

答案 1 :(得分:3)

这是一个awk混合了jaypal和sudo_o解决方案 它不会给出误报,因为它会测试线条的唯一性。

awk '!a[$1 FS FILENAME]++ && ++b[$1]==3' test*
JJTP@yahoo.com

如果您的文件数量不详,可以选择

awk '!a[$1 FS FILENAME]++ && ++b[$1]==ARGC-1' test*

ARGC存储awk + 1

读取的文件数

答案 2 :(得分:1)

comm列出了两个文件的公共行。只需找到前两个文件中的公共行,然后再次将输出传递给comm,并找到第三个文件的公共行。

comm -12 <(sort Test1.txt) <(sort Test2.txt) | comm -12 - <(sort Test3.txt)

答案 3 :(得分:0)

要查找两个文件中的公共行,您可以使用:

  sort Test1.txt Test2.txt | uniq -d

或者,如果您希望保留在Test1.txt中找到的订单,您可以使用:

  while read x; do grep -w "$x" Test2.txt; done < Test1.txt 

对于三个文件,请重复此步骤:

  sort Test1.txt Test2.txt | uniq -d | sort - Test3.txt | uniq -d

或者:

  cat                           Test1.txt       |\
  while read x; do grep -w "$x" Test2.txt; done |\
  while read x; do grep -w "$x" Test3.txt; done

sort方法假设文件本身没有重复的行;如果是这样,您可能需要创建临时文件。

如果您希望使用sed而不是grep,请尝试sed -n "/^$x$/p"

答案 4 :(得分:0)

以下是您对awk

的处理方式
awk '
FILENAME == ARGV[1] { a[$0]++ }
FILENAME == ARGV[2] && ($0 in a) { b[$0]++ }
FILENAME == ARGV[3] && ($0 in b)' file1 file2 file3

输出:

JJTP@yahoo.com