Я пытаюсь создать новый файл на основе совпадения. В файле input есть список идентификаторов, которые будут соответствовать $5 перед | в файле. Если два идентификатора совпадают, тогда вся строка из файла является частью нового файла. Если совпадений не найдено, программа пропускает их и продолжает. Приведенный ниже awk выполняется, но результирующий файл new пуст. Спасибо :).

ввод

DACH1
POLE2
GNG7

< Сильный > файл

chr13   60737711    60737910    chr13:60737711-60737910 DIAPH3-673|gc=69.3
chr13   72337884    72338003    chr13:72337884-72338003 DACH1-674|gc=30.3
chr19   2591538 2591657 chr19:2591538-2591657   GNG7-183|gc=48.7

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

chr13   72337884    72338003    chr13:72337884-72338003 DACH1-674|gc=30.3
chr19   2591538 2591657 chr19:2591538-2591657   GNG7-183|gc=48.7

awk

awk 'BEGIN {FS=OFS="|"} NR==FNR{a[$1]=$5;next} $5 in a{$5=a[$1];print $0}' input file > new
awk
2
justaguy 16 Апр 2016 в 20:21

2 ответа

Лучший ответ

Вместо этого используйте grep.

  grep -w -f inputfile filetomodify > newfile

Из того, что я вижу, вы просто хотите вывести строки в файле, которые имеют запись соответствия во входном файле. это мир grep :) ключ -f указывает ему использовать файл в качестве входных шаблонов, каждая строка во входном файле является шаблоном.

ПРИМЕЧАНИЕ: используйте параметр -w (совпадение всего слова), если вы получаете совпадения, которые включают что-то вроде GNG77-123 (потому что оно начинается с GNG7) или AGNG7-123 (потому что в нем есть GNG7).

2
Rob 16 Апр 2016 в 19:43
$ awk 'NR==FNR{a[$1];next} {k=$NF; sub(/-.*/,"",k)} k in a' input file
chr13   72337884    72338003    chr13:72337884-72338003 DACH1-674|gc=30.3
chr19   2591538 2591657 chr19:2591538-2591657   GNG7-183|gc=48.7
2
Ed Morton 16 Апр 2016 в 17:53