Я хочу создать файл, содержащий столбцы из двух входных файлов. Файл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)