Несколько условных выходов от одного входа - PullRequest
0 голосов
/ 10 мая 2019

У меня есть файл test.txt. Я ищу несколько совпадений с образцами и печатаю их независимо друг от друга с помощью

    awk 'substr($1,5,15) ~ /ccc/ { print $0 }' test.txt >test1.txt
    awk 'substr($1,5,15) ~ /abb/ { print $0 }' test.txt >test2.txt
    awk 'substr($1,5,15) ~ /abc/ { print $0 }' test.txt >test3.txt

Теперь я могу запустить его за один раз. Как после

    awk 'substr($1,5,15) ~ /ccc/ { print $0 }' test.txt 

в строках, которые не соответствуют вышеприведенному шаблону, я могу запустить

    awk 'substr($1,5,15) ~ /abb/ { print $0 }'  

и аналогично в несравненных линиях образца

    awk 'substr($1,5,15) ~ /abc/ { print $0 }'

Входной файл test.txt

   NNNNNabcabAAAAATCTAATCTGCCAGTT
   NNNNNabcccTTTTTCTAGTCACGATAGCC
   NNNNNaaabbCTAGTTTGTGTAGTAATTTT
   NNNNNaaaabTTTTTTTTTTTTTTTTTTTT
   NNNNNabbbbTTTTTTCACTACTGGGTTTC
   NNNNNabcaaTTTTTTTTAATGGGTCTCAA
   NNNNNabaccTTTTTTTTTCGGGAGGCGGG
   NNNNNccaaaTTTTTTTTTTTTTATTTGAG
   NNNNNabcccTTTTTTTTTACACACAATTC
   NNNNNabcccTAAGACTGGCCCACAGCTGA
   NNNNNabcaaTAGAGACGGGGTTTCACCAT
   NNNNNabcaaTTTTTGTCGAAGATCTCACC
   NNNNNabcabTTGGTAAACAGGCGGGTGTA
   NNNNNabcccTACTTTTTTTAGTGATACAC
   NNNNNaaabbTTTTTGCAAAAAGTAATTTG
   NNNNNabcabTTTTTTTTTCTTTCTGCCTG
   NNNNNabcaaTTTTGAGACAGAATCTTGCT
   NNNNNaaabbTTTTTTTTTTTTTACTAGTG
   NNNNNabcccTAGACAGGGAATACTTTATT
   NNNNNabcabGACAGGGAATACTTATATTC

awk 'substr ($ 1,5,15) ~ / ccc / {print $ 0}' test.txt> test1.txt

test1.txt

NNNNNabcccTTTTTCTAGTCACGATAGCC
NNNNNabcccTTTTTTTTTACACACAATTC
NNNNNabcccTAAGACTGGCCCACAGCTGA
NNNNNabcccTACTTTTTTTAGTGATACAC
NNNNNabcccTAGACAGGGAATACTTTATT

awk 'substr ($ 1,5,15) ~ / abb / {print $ 0}' test.txt> test2.txt

test2.txt

NNNNNaaabbCTAGTTTGTGTAGTAATTTT
NNNNNabbbbTTTTTTCACTACTGGGTTTC
NNNNNaaabbTTTTTGCAAAAAGTAATTTG
NNNNNaaabbTTTTTTTTTTTTTACTAGTG

awk 'substr ($ 1,5,15) ~ / abc / {print $ 0}' test.txt> test3.txt

NNNNNabcabAAAAATCTAATCTGCCAGTT
NNNNNabcccTTTTTCTAGTCACGATAGCC
NNNNNabcaaTTTTTTTTAATGGGTCTCAA
NNNNNabcccTTTTTTTTTACACACAATTC
NNNNNabcccTAAGACTGGCCCACAGCTGA
NNNNNabcaaTAGAGACGGGGTTTCACCAT
NNNNNabcaaTTTTTGTCGAAGATCTCACC
NNNNNabcabTTGGTAAACAGGCGGGTGTA
NNNNNabcccTACTTTTTTTAGTGATACAC
NNNNNabcabTTTTTTTTTCTTTCTGCCTG
NNNNNabcaaTTTTGAGACAGAATCTTGCT
NNNNNabcccTAGACAGGGAATACTTTATT
NNNNNabcabGACAGGGAATACTTATATTC

При этом следующие строки находятся в двух выходных файлах

  NNNNNabcccTAAGACTGGCCCACAGCTGA
  NNNNNabcccTACTTTTTTTAGTGATACAC
  NNNNNabcccTAGACAGGGAATACTTTATT
  NNNNNabcccTTTTTCTAGTCACGATAGCC
  NNNNNabcccTTTTTTTTTACACACAATTC

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

test1.txt

NNNNNabcccTTTTTCTAGTCACGATAGCC
NNNNNabcccTTTTTTTTTACACACAATTC
NNNNNabcccTAAGACTGGCCCACAGCTGA
NNNNNabcccTACTTTTTTTAGTGATACAC
NNNNNabcccTAGACAGGGAATACTTTATT

test2.txt

NNNNNaaabbCTAGTTTGTGTAGTAATTTT
NNNNNabbbbTTTTTTCACTACTGGGTTTC
NNNNNaaabbTTTTTGCAAAAAGTAATTTG
NNNNNaaabbTTTTTTTTTTTTTACTAGTG

test3.txt

NNNNNabcabAAAAATCTAATCTGCCAGTT
NNNNNabcaaTTTTTTTTAATGGGTCTCAA
NNNNNabcaaTAGAGACGGGGTTTCACCAT
NNNNNabcaaTTTTTGTCGAAGATCTCACC
NNNNNabcabTTGGTAAACAGGCGGGTGTA
NNNNNabcabTTTTTTTTTCTTTCTGCCTG
NNNNNabcaaTTTTGAGACAGAATCTTGCT
NNNNNabcabGACAGGGAATACTTATATTC

Ответы [ 3 ]

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

Чтобы выполнить все три в одном процессе awk, попробуйте:

awk 'substr($1,5,15) ~ /ccc/ { print>"test1.txt"}
    substr($1,5,15) ~ /abb/ { print>"test2.txt"}
    substr($1,5,15) ~ /abc/ { print>"test3.txt"}' test.txt

Здесь print>"test1.txt" печатает в файл test1.txt.

Обратите внимание, что > означает что-то другое в awk, чем в shell. В awk, как и в shell, первый print файла будет перезаписывать предыдущее содержимое файла. Однако, в отличие от shell, последующие операторы awk print, использующие > , добавляют к файлу.

Вариация: печать только в первый соответствующий выходной файл

awk 'substr($1,5,15) ~ /ccc/ { print>"test1.txt"; next}
    substr($1,5,15) ~ /abb/ { print>"test2.txt"; next}
    substr($1,5,15) ~ /abc/ { print>"test3.txt"}' test.txt

Здесь, когда совпадение найдено, next говорит awk пропустить остальные тесты и перейти к следующей строке.

2 голосов
/ 10 мая 2019
awk '
{
    str = substr($1,5,15)
    out = 0
    if      (str ~ /ccc/) out=1
    else if (str ~ /abb/) out=2
    else if (str ~ /abc/) out=3
}
out { print > ("test" out ".txt") }
' test.txt

В GNU awk вы можете использовать оператор switch вместо вложенного if s.

0 голосов
/ 10 мая 2019

Этот гольф не предполагает одновременных матчей.

gawk '{
  match(substr($1,5,15), /(ccc)|(abb)|(abc)/, A)   # probably unnecessary substring
  for(i in A) n=i                                  # get last index of A (match number)
  print > "test" n ".txt"                          # print to variable filename
}' test.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...