awk / grep печатать ВСЕ запись в файле2 на основе списка совпадающих строк в файле1 - PullRequest
0 голосов
/ 29 мая 2018

Этот вопрос имеет некоторую популярность на stackoverflow.Я просмотрел предыдущие посты, но не могу найти решение, которое мне нужно.

У меня есть два файла.Один файл представляет собой список идентификаторов строк, а другой - список записей.Я хотел бы сопоставить каждый элемент в списке file1 с записью в file2, а затем распечатать всю соответствующую запись в file2.Моя текущая проблема заключается в том, что я могу печатать только первую строку (не всю запись) файла два.

Примеры:

File1
id100
id000
id004
...

File2
>gnl|gene42342|rna3234| id0023
CCAATGAGA
>gnl|gene402|rna9502| id004
AAAAAAGGGGGGGGGG
>gnl|gene422|rna22229| id100
GATTACAGATTACA
....

Желаемый вывод:

>gnl|gene402|rna9502| id004
AAAAAAGGGGGGGGGG
>gnl|gene422|rna22229| id100
GATTACAGATTACA

Мой текущий код:

awk 'NR==FNR{a[$0];next}{for(i in a)if(index($0,i)){print $1 ;next}}' file1 file2

только печатает:

>gnl|gene402|rna9502| id004
>gnl|gene422|rna22229| id100

, и попытка указать RS приводит к печати всего файла ..., то есть:

 awk 'NR==FNR{a[$0];next}{for(i in a)if(index($0,i)){RS=">"}{print $1 ;next}}' file1 file2

печать

>gnl|gene42342|rna3234| id0023
CCAATGAGA
>gnl|gene402|rna9502| id004
AAAAAAGGGGGGGGGG
>gnl|gene422|rna22229| id100
GATTACAGATTACA
....

У меня та же проблема с grep.Печатается первая строка, но не вся запись:

grep -Fwf file1 file2

дает

>gnl|gene402|rna9502| id004
>gnl|gene422|rna22229| id100

Мне кажется, что я просто определяю RS в неправильном месте, но не могу понятьгдеЛюбой совет приветствуется!

edit:

реальный файл выглядит примерно так:

awk '{print $0}' file2

>gnl|gene49202|rna95089| id0023
GGTGCTCTAGACAAAACATTGATTCCTCGTGACTGGGATTAGCCAATAGCTGAACGCGACTGAGTGTGAAACACGGAGGA
GGAGTAGGAAGTTGGAACTAGACAGGCGACTCGGTTAGGGGACACCGGAGAGATGACTCATGACTCGTGGAAACCAACGT
GAGCTTGCCCGACAAAAGAATATGAAGAAAAGTCAGGATAAACAAAAGAAACAAGATGATGGCTTGTCTGCTGCTGCACG
GAAGCACTGACCCTTTCACCAAACCACAGTGCTCTCACTGCTATGTACTGTGTTCAGcctttttatttgtcacaggCTTGTAGCAT
AGCTCCTTTATTGCCTCTTGTACATACTATAAATTCTCCATATGATTCTCTTTATTTTCATCTATTCCCCACTGATGGCT
CTCTAACTGCATGCTGGTTTAGCATTGCTTAAGTCTGCTCTGGAAAATACATGTTTTGAGGGAGTACAAACAGATCATGT
CCCTTCCTTCAACTCAAATGACCTTTTTGTATTCACGGTGACCCAGttgaatatttaataaagaatttttttctgtga

>gnl|gene37771|rna78596| id230400
GGCGATACTAGATGTTGGCGGGGTTACACTGTAGATGCGGGGGGGCTACACTAGATGTGGGCGAGGCTACACTGCAGATG
TGGGCAAGGCTATACTAGATGTGGGTGGGGCTACACTGTAGATGTGGGTGGGGCTACACTTCAGATGTGGGCGAGGCTAT
ACTGTAGATGTGGGCTGAATTTCCTATAAAGCCTGTACCTTCTTTGTTTTTGCAGGGCTTGATGGCAGAATGGAGCAGCC
AGAGCTACAGAGTGGATGACCCAGATTTGGCCCTAACCTTTCCCACCCGGCCTGGTTTCCGTAGCTTTCCCAGTCCCCAA
GTCTTTCCTATTTTCTCCCTCTTGCCACAATCTGATCCCTGCAGTAACAATGAGCTGGTTGAGTAAACTTAACCCTCGGG
GAGCTGGCGGCAGGGCCAAGTGTCAGTCTCCAACCGCCGCTCACTGCC

Ответы [ 3 ]

0 голосов
/ 29 мая 2018

это должно работать, если ваши записи разделены одной или несколькими пустыми строками.

$ awk -v ORS='\n\n' 'NR==FNR{a[$1]; next} $2 in a' file1 RS= file2

здесь вывод также разделен одной пустой строкой, если вы хотите удалить пустые строки, просто удалите -v ORS='\n\n'

0 голосов
/ 29 мая 2018
$ grep -A1 -Fwf file1 file2
>gnl|gene402|rna9502| id004
AAAAAAGGGGGGGGGG
>gnl|gene422|rna22229| id100
GATTACAGATTACA

-A1 означает «также показывать 1 строку A после матча».Проверьте страницу руководства по grep.

Если информация о трейлинге - это фиксированное количество строк, соответственно настройте «1».В противном случае вам понадобится awk, perl или ... для более гибкого решения.

0 голосов
/ 29 мая 2018

РЕДАКТИРОВАТЬ: Поскольку OP изменила Input_file так, как для нового ввода Я сейчас пишу этот код.

awk -F"| " 'FNR==NR{a[$0];next} /^>/{flag=""} ($NF in a){flag=1} flag' FILE1  FILE2

После awkможет помочь вам здесь.

awk 'FNR==NR{a[$0];next} ($3 in a){print $0;getline;print}' Input_file1 FS="|" Input_file2
...