2015-08-27 3 views
1

У меня есть два файла, один с новой строкой список разделенной числовых идентификаторовпечать линии с матчем и следующей строкой, но только первым матчем, из файла строк

>cat list.txt 
3342 
232 
... 

и один с этими идентификаторами и некоторой последовательностью данные в строке после

>cat Seqeunce.txt 

>600 
ATCGCGG 
>3342 
ACTCGGTC 
>232 
TGTGCT 
>3342 
ACGCGGTC 

Я хотел бы, чтобы напечатать все строки с спичкой ID и в следующей строке, но только в первый раз найдено совпадение. Таким образом, из пут будут:

> ...some code... list.txt Sequence.txt 
>3342 
ACTCGGTC 
>232 
TGTGCT 

Обратите внимание, что только строка с первым появлением ID 3342, а в следующей строке, печатается

Я попытался с помощью Grep,

grep -f list.txt -A 1 -m 1 Sequence.txt 

Но он не работал. Просто запуск grep -A 1 и -m 1 с фактическим идентификатором создавал то, что я хочу, но у меня есть тысячи идентификаторов и не могу запускать их вручную.

+0

Это требует повторного сканирования sequence.txt для каждого идентификатора в list.txt. Если у вас есть тысячи и тысячи, вы будете уничтожать часы ожидания жесткого диска, чтобы закончить. Вы можете сделать это за 1 проход, если вы заранее знаете id (list.txt). Однако для этого вам нужен сценарий. Вы можете создать regex trie, используя инструмент [this] (http://www.regexformat.com/Dnl/_Samples/_Ternary_Tool%20 (Dictionary) /___txt/Q-words.txt), а затем сопоставить файл данных с ним. Результат мгновенный. – sln

+0

Отличная точка. Если у вас действительно есть тысячи идентификаторов для поиска, вы должны использовать инструмент, подходящий для поиска ... вы могли бы сделать очень простую программу, где 'Sequence.txt' был прочитан в карте/хэш/ассоциативном массиве (независимо от того, какой язык называет их), а затем вы можете выполнять поиск быстро и легко. – dcsohl

ответ

0

Вы так близко. Дайте это попробовать:

for id in `cat list.txt`; do grep -A 1 -m 1 -x ">$id" Sequence.txt; done 
+1

@EdMorton - D'oh. Ты прав. Я исправил это. – dcsohl

2
awk 'NR==FNR{tgts[">"$0]; next} $0 in tgts{c=2; delete tgts[$0]} c&&c--' list.txt sequence.txt 
>3342 
ACTCGGTC 
>232 
TGTGCT 
+1

'c && c -' как это работает? –

+0

Он читает: если c не равно нулю, то декремент c, и если результатом этого является то, что c все еще не равен нулю, тогда вызывается действие по умолчанию для печати текущей записи. Вы могли бы подумать, что можете сделать что-то вроде 'c -> 0', но я не уверен, что в огромном файле' c - 'не будет превышать размер переменной и обернуться вокруг, чтобы снова стать положительным (как -MAXINT - 1 = MAXINT). Вы можете увидеть его больше на http://stackoverflow.com/a/18409469/1745001 –

1

Вы можете использовать эту команду AWK:

awk -F'>' 'NR==FNR{a[$1];next} $2 in a{p=1; print; delete a[$2]; next}; 
     p; {p=0}' list.txt Sequence.txt 
>3342 
ACTCGGTC 
>232 
TGTGCT 
Смежные вопросы