File1
содержит список генов (обозначенных буквами). Каждый ген описан белком, который он экспрессирует (обозначенным буквами):
a-1
b-2
c-3
File2
также содержит список генов, но каждый из них повторяется несколько раз. Некоторые из этих генов похожи на гены File1
:
a
a
a
b
b
c
c
c
Мне нужно будет найти все гены в , File1
которые являются общими в File2
. Общие гены должны быть напечатаны в третьем файле (и множественные копии тоже). Вместе с этим, тип белка, который экспрессируют гены, должен быть записан вместе с ним (точно так же, как в File1
).
Как я могу получить следующее File3
?
a-1
a-1
a-1
b-2
b-2
c-3
c-3
c-3
решение1
Вот простой способ сделать это с помощью gawk, в котором есть встроенная переменная ARGIND
— индекс ARGV
текущего обрабатываемого файла.
Мы разделяем каждую входную строку первого файла на -
и используем первое поле для индексации в массив table
, который хранит всю строку. Для второго файла (и любых последующих файлов) мы используем всю строку как индекс в table
для извлечения нужной строки.
BEGIN{FS = "-"}
ARGIND==1{table[$1] = $0}
ARGIND>1{print table[$0]}
Или в одной строке:
awk 'BEGIN{FS = "-"}; ARGIND==1{table[$1] = $0}; ARGIND>1{print table[$0]}' file_1 file_2
Вот еще одна версия, которая будет работать на традиционном awk. Она определяет, является ли текущий файл первым, сравнивая FNR
, номер входной записи в текущем входном файле, с NR
, общим числом входных записей, просмотренных до сих пор.
awk -F'-' 'NR==FNR{table[$1] = $0}; NR>FNR{print table[$0]}' file_1 file_2