我有四个文件,如下所示:
文件 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