Объединение 2 файлов на основе совпадения полей

Объединение 2 файлов на основе совпадения полей

Я хочу создать файл, содержащий столбцы из двух входных файлов. Файл1 выглядит так:

aa 32
bb 15
cc 78

Файл2:

fa 19
bc 23
cc 50
de 28
aa 45
bb 31

Задача состоит в том, чтобы прочитать File1 и, если первое поле строки существует среди первых полей File2, вывести эту строку File2 с обоими столбцами и добавить запись второго столбца File1, содержащую первое поле.

Вывод должен быть таким:

aa 45 32
bb 31 15
cc 50 78

Для скрипта предпочтительнее использовать awk.

решение1

$ awk 'FNR==NR{a[$1]=$2;next} ($1 in a) {print $1,a[$1],$2}' file2 file1
aa 45 32
bb 31 15
cc 50 78

Объяснение:

awkнеявно проходит по каждому файлу, по одной строке за раз. Поскольку мы указали его file2в качестве первого аргумента, он читается первым. file1читается вторым.

  • FNR==NR{a[$1]=$2;next}

    NR— это количество строк, которые awkбыли прочитаны до сих пор, а FNR— это количество строк, которые awkбыли прочитаны до сих пор из текущего файла. Таким образом, если FNR==NR, мы все еще читаем первый поименованный файл: file2. Для каждой строки в file2мы назначаем a[$1]=$2.

    Здесь,a этоассоциативный массиви a[$1]=$2означает сохранение второго столбца файла file2, обозначенного $2, как значения в массиве, aиспользуя первый столбец файла file2, $1, в качестве ключа.

    nextговорит awkо необходимости пропустить оставшиеся команды и начать заново со следующей строки.

  • ($1 in a) {print $1,a[$1],$2}

    Если мы попали сюда, это значит, что мы читаем второй файл: file1. Если мы увидели первое поле строки в file2, как определено содержимым массива a, то мы выводим строку со значениями поля 2 из обоих файлов.

решение2

Мне нравится решение awk, но я думаю, что это может быть проще:

sort file1 > sortedFile1
sort file2 > sortedFile2
join -o 1.1 2.2 1.2 sortedFile1 sortedFile2

Эта опция -oпереопределит формат, который вы выберете в качестве первого поля первого файла, второго поля второго файла и второго поля первого файла.

решение3

Присоединить 2-й файл File2к 1-му файлу File1.

join <(sort -k1 file2) <(sort -k1 file1)

Связанный контент