Как заменить значения файла значениями другого файла? - PullRequest
1 голос
/ 12 июня 2019

Я объясняю свою проблему:

У меня есть два файла, один из которых выглядит следующим образом (это файл .tsv, в каждой строке необязательно одинаковое количество столбцов):

OTU0001 Archaea
OTU0002 Archaea;Aenigmarchaeota;Deep Sea Euryarchaeotic Group(DSEG);uncultured archaeon
OTU0003 Archaea;Altiarchaeales;uncultured euryarchaeote
OTU0004 Archaea;Bathyarchaeota;uncultured archaeon
OTU0005 Archaea;Diapherotrites;uncultured euryarchaeote
OTU0006 Archaea;Euryarchaeota;Halobacteria;Halobacteriales;Halobacteriaceae;uncultured
OTU0007 Archaea;Euryarchaeota;Halobacteria;Halobacteriales;Halobacteriaceae;uncultured;marine metagenome

Каждая строка начинается с OTUXXXX, и этот идентификатор всегда находится в первом столбце.

Другой файл .tsv с 3 столбцами:

OTU3978 UniRef90_A0A010P3Z8 0.846
OTU0006 UniRef90_A0A010P3Z8 0.855
OTU4929 UniRef90_A0A010P3Z8 0.829
OTU4317 UniRef90_A0A011P550 0.85
OTU4816 UniRef90_A0A011P550 0.807
OTU3902 UniRef90_A0A011QPQ2 0.836
OTU3339 UniRef90_A0A011RKI6 0.835
OTU1359 UniRef90_A0A011RLA7 0.801
OTU2085 UniRef90_A0A011RLA7 0.843
OTU3542 UniRef90_A0A011RLA7 0.866

Я хотел бы заменить во втором файле каждый OTUXXX вторым столбцом первого файла. Например, он должен дать (для 2-й строки второго файла):

OTU0006UniRef90_A0A010P3Z8 0.855, который становится:

Archaea;Euryarchaeota;Halobacteria;Halobacteriales;Halobacteriaceae;uncultured UniRef90_A0A010P3Z8 0.855

Возможно ли это в bash?

Редактировать:

Я могу заменить столбцы этим

awk 'FNR==NR{a[NR]=$2;next}{$1=a[FNR]}1' f1 f2

Но это не «автоматический», первая строка файла 1 будет совпадать с первой строкой файла 2 ... Нет изменений в соответствии со значением OTUXXX

1 Ответ

1 голос
/ 12 июня 2019

Ты довольно близко. Вы можете использовать это awk:

awk 'NR == FNR {a[$1] = $2; next} $1 in a{$1 = a[$1]} 1' f1 f2

OTU3978 UniRef90_A0A010P3Z8 0.846
Archaea;Euryarchaeota;Halobacteria;Halobacteriales;Halobacteriaceae;uncultured UniRef90_A0A010P3Z8 0.855
OTU4929 UniRef90_A0A010P3Z8 0.829
OTU4317 UniRef90_A0A011P550 0.85
OTU4816 UniRef90_A0A011P550 0.807
OTU3902 UniRef90_A0A011QPQ2 0.836
OTU3339 UniRef90_A0A011RKI6 0.835
OTU1359 UniRef90_A0A011RLA7 0.801
OTU2085 UniRef90_A0A011RLA7 0.843
OTU3542 UniRef90_A0A011RLA7 0.866
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...