如何比较多个文件并显示共同行?

如何比较多个文件并显示共同行?

我有四个文件,如下所示:

文件 1 内容(制表符分隔,3 列):

applepen apple pen
strawberry straw berry

文件2内容:

applepen
strawjelly

文件3内容(此文件已排序):

apple
fan
straw

文件4内容(此文件已排序):

pen
zenith

我需要比较文件 1 的字段 1 与文件 2、文件 1 的字段 2 与文件 3 以及文件 1 的字段 3 与文件 4。如果找到所有三个匹配项,我想打印文件的字段 1,2,3 1. 我想对文件 1 中的每一行执行此操作。

这里的输出应该是:

applepen apple pen

有没有办法使用 grep 或 comm 或类似的东西来做到这一点?

答案1

这是一项任务join

$ cat file1 
applepen    apple   pen
strawberry  straw   berry
$ cat file2
applepen
strawjelly
$ cat file3
apple
fan
straw
$ cat file4
pen
zenith
$ join file[12] | join -1 2 -o 1.1,1.2,1.3 - file3 | join -1 3 -o 1.1,1.2,1.3 - file4
applepen apple pen
$ 

如果您确实关心制表符而不是空格,则可以使用 来将它们翻译回来| tr ' ' '\t'

答案2

while read -r f11 f12 f13
do
  grep -qxFe "$f11" file2 && 
  grep -qxFe "$f12" file3 && 
  grep -qxFe "$f13" file4 && 
  printf "%s\n" "$f11 $f12 $f13"
done < file1

相关内容