У меня есть четыре таких файла:
Содержимое файла 1 (разделены табуляцией, 3 столбца):
applepen apple pen
strawberry straw berry
Содержимое файла 2:
applepen
strawjelly
Содержимое файла 3 (этот файл отсортирован):
apple
fan
straw
Содержимое файла 4 (Этот файл отсортирован):
pen
zenith
Мне нужно сравнить поле 1 файла 1 с файлом 2, поле 2 файла 1 с файлом 3 и поле 3 файла 1 с файлом 4. Если все три совпадения найдены, я хочу для печати поля 1,2,3 файла 1. Я хочу сделать это для каждой строки в файле 1.
Здесь должен быть вывод:
applepen apple pen
Есть ли способ сделать это с помощью grep, comm или чего-то подобного ?
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
Это задание для 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'
.