Поиск совпадения поданных и замена двух столбцов для сопоставления строк в двух файлах - PullRequest
1 голос
/ 11 мая 2019

У меня есть два файла. Количество строк в File1 больше, чем File2. Сильфон представляет собой небольшое представление файлов. Я хочу сравнить column1 обоих файлов, и если они совпадают, я хочу напечатать строку из File1; замена столбца 10 и столбца 11 файла1 на файл2

При попытке следующей команды ее строки печати также не совпадают.

awk 'BEGIN{FS=OFS="\t"} NR==FNR {s[$1]=$10; q[$1]=$11; next} $1 in s { $10=s[$1]; $11=q[$1]}1' File2 File1

File1

1_223022/4194397/c  4   *   0   255 *   *   0   0   zvt 443 np:i:79 rs:B:i,79,0,0,0,80,0    sn:B:f,7.14491,13.3994,7.52773,12.8957  za:f:0  zs:B:f,0
1_223022/4194398/c  4   *   0   255 *   *   0   0   tty 221 np:i:92 rs:B:i,94,0,0,0,0,0 sn:B:f,6.0494,11.9021,5.88262,10.3733   za:f:0  zs:B:f,0
411_223022/4194426/v    4   *   0   255 *   *   0   0   gvy 721 np:i:17 rs:B:i,19,0,0,0,1,0 sn:B:f,7.48538,14.1506,7.67945,13.5199  za:f:0  zs:B:f,0

File2

1_223022/4194397/c  4   *   0   0   *   *   0   0   vtg 235 MT
1_223022/4194398/c  4   *   0   0   *   *   0   0   aat 999 SO

Ожидаемый результат

1_223022/4194397/c  4   *   0   255 *   *   0   0   vtg 235 np:i:79 rs:B:i,79,0,0,0,80,0    sn:B:f,7.14491,13.3994,7.52773,12.8957  za:f:0  zs:B:f,0
1_223022/4194398/c  4   *   0   255 *   *   0   0   aat 999 np:i:92 rs:B:i,94,0,0,0,0,0 sn:B:f,6.0494,11.9021,5.88262,10.3733   za:f:0  zs:B:f,0

Ответы [ 2 ]

3 голосов
/ 11 мая 2019

Посмотрите на конец вашей команды:

}1

1 всегда будет иметь значение true, что заставляет awk печатать каждую строку

Вместо этого должно быть:

 ... $1 in s { $10=s[$1]; $11=q[$1];print}

Напоминание:

awk программы состоят из последовательности

CONDITION { Block of actions } [; CONDITION { Block of actions } ; ... ]

, где условие или блок действий являются необязательными: Если условиеотсутствует, awk всегда будет выполнять блок действий, если блок действий отсутствует, awk будет использовать print в качестве действия по умолчанию, если условие оценивается как true.

1

всегдаистинное состояние без действий.Это означает, что awk напечатает строку.

2 голосов
/ 11 мая 2019

Не могли бы вы попробовать следующее.

awk 'FNR==NR{a[$1]=$10;b[$1]=$11;next} ($1 in a){$10=a[$1];$11=b[$1];print}'  file2  file1

Добавьте BEGIN{FS=OFS="\t"} в случае, если ваши Input_files разделены табуляцией, и вам нужен вывод также в форме табуляции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...