2013-05-01 3 views
0

У меня есть файл, который содержит список чисел. У меня есть второй файл с различными записями и несколькими полями каждый.

Что я хочу сделать, это получить все линии, 12-е поле которых равно 1-му числу, и поместить их в новый файл, затем на второе число и т. Д.

Я написал однострочный вкладыш, который имеет смысл, но я не могу понять, почему это не сработает.

Это список номеров:

кошка truncations_list.txt

3 
318 
407 
412 
7 

Файл с записями быть рассортированные:

M00970:45:000000000-A42FD:1:1101:14736:1399 TGCCCAGTGCTCTGAATGTNNNNNTGAAGAAATTCAAGTAAGCGCGGGTCATCGGCNGGAGTAACTATGACTCTNTTAAGGAGGACCAATATGAACCANACNNNNNNNNNACTNTATCTAGGGTTCCCTGCACAGTATGTGNCC 79 TGCCCAGTGCTCTGAATGTNNNNNTGAAGAAATTCAAGTAAGCGCGGGTCATCGGCNGGAGTAACTATGACTCTNTTAA 65 GGAGGACCAATATGAACCANACNNNNNNNNNACTNTATCTAGGGTTCCCTGCACAGTATGTGNCC 79S65M 1 81 TGCCCAGTGCTCTGAATGTNNNNNTGAAGAAATTCAAGTAAGCGCGGGTCATCGGCNGGAGTAACTATGACTCTNTTAAGG -2 318 
M00970:45:000000000-A42FD:1:1101:15371:1399 TGCCCAGTGCTCTGAATGTNNNNNTGAAGAAATTCAAGTAAGCGCGGGTCAACGGCNGGAGTAACTATGACTCTNTTAAGGAGTCGGTGTTCACATGCNATNNNNNNNNNCAGNCGAACTTGATGAAGAACGTCGACGTGTNGG 83 TGCCCAGTGCTCTGAATGTNNNNNTGAAGAAATTCAAGTAAGCGCGGGTCAACGGCNGGAGTAACTATGACTCTNTTAAGGAG 61 TCGGTGTTCACATGCNATNNNNNNNNNCAGNCGAACTTGATGAAGAACGTCGACGTGTNGG 83S61M 1 81 TGCCCAGTGCTCTGAATGTNNNNNTGAAGAAATTCAAGTAAGCGCGGGTCAACGGCNGGAGTAACTATGACTCTNTTAAGG 2 407 

Это моя команда:

file="truncations_list.txt" 
while read line; do awk '$12==$line' R2_Output.txt >reads_$line.txt ; done <"$file" 

Эта команда создаст все файлы «reads_412.txt» и т. Д., Но все файлы пустые.

Я ценю вашу помощь!

ответ

3

Основная проблема заключается в том, что awk-программа находится в одинарных кавычках, поэтому переменная «$ line» никогда не расширяется. Быстрое исправление:

awk -v num=$line '$12==num' R2_Output.txt 

Но, не делайте этого. Вы читаете выходной файл один раз для каждой строки в файле чисел. Вы можете заставить его работать, просто прочитав каждый файл только один раз:

awk ' 
    # read the list of numbers in truncations_list 
    FNR == NR { 
     num[$1] 
     next 
    } 

    # process each line of the output file 
    # any lines with an "unknown" $12 will be ignored 
    $12 in num { 
     f = "reads_" $12 ".txt" 
     print >> f 
    } 
' truncations_list.txt R2_Output.txt 
+1

+1, но я думаю, что перенаправление должно быть '>' вместо '> > 'или вам нужно будет убедиться, что файлы не существуют в первую очередь. –

+0

Спасибо, это намного лучше, чем чтение файла снова и снова. Блестящий :) –

+0

@EdMorton Да, правильно! Благодаря! –

0

Минимизация ссылок на переменные поля $ x может улучшить производительность Awk. Это в основном вопросы для более сложных сценариев, но его стоит попробовать эту небольшую оптимизацию в случае, если вы обрабатываете большие файлы с миллионами записей:

awk 'FNR==NR {a[$1]; next} (f=$12) in a {print >f}' trunc.txt R2_Out.txt