Сортировка и соединение (но нет awk ) метод:
sort -k2 main.txt > main_sort.txt ; \
sort -k1 changes.txt > changes_sort.txt ; \
{ join -i -1 2 -2 1 -o 1.1 2.2 main_sort.txt changes_sort.txt ; \
join -v 1 -i -1 2 -2 1 -o 1.1 1.2 main_sort.txt changes_sort.txt ; } | \
sort -g | column -t
Вывод:
word_1 root_A
word_2 root_A
word_3 genre_B
word_4 root_C
word_5 root_A
Объяснение ...
join
требует двух файлов с отсортированными полями. Поскольку каждый файл имеет большой размер и его нужно использовать дважды, более эффективно отсортировать оба файла заранее. Предположим, что все файлы разделены табуляцией .
Сортировка main.txt по 2-му полю (жанру) и изменениям.txt в поле 1-е (корневое):
sort -k2 main.txt > main_sort.txt
sort -k1 changes.txt > changes_sort.txt
Пройдите 1, выведите строки с совпадениями:
join -i -1 2 -2 1 -o 1.1 2.2 main_sort.txt changes_sort.txt
Который выводит 4 строки, отсортированные по полю корня :
word_1 root_A
word_2 root_A
word_5 root_A
word_4 root_C
Флаги соединения
"- 1 2 -2 1" сообщают ему присоединить к 1-му файлу секунда к полю 2-го файла первого поля. Флаги "- o 1.1 2.2" сообщают ему напечатать первое первое поле 1-го файла в 2-е второе поле файла.
Шаг 2, используйте флаг "- v 1" для вывода недостающей строки из первого файла:
join -v 1 -i -1 2 -2 1 -o 1.1 1.2 main_sort.txt changes_sort.txt
Вывод:
word_3 genre_B
После чего выводятся оба объединяются, а затем сортируются (см. начало ответа).