Estoy teniendo un archivo test.txt. Estoy buscando coincidencia de patrones múltiples y los estoy imprimiendo de forma independiente uno por uno con

    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

Ahora, ¿puedo ejecutarlo de una vez? Como después

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

En las líneas que no coinciden con el patrón anterior, ¿puedo ejecutar

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

Y de manera similar en líneas de patrones sin igual

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

Archivo de entrada 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

Mientras hace esto, las siguientes líneas están en dos archivos de salida

  NNNNNabcccTAAGACTGGCCCACAGCTGA
  NNNNNabcccTACTTTTTTTAGTGATACAC
  NNNNNabcccTAGACAGGGAATACTTTATT
  NNNNNabcccTTTTTCTAGTCACGATAGCC
  NNNNNabcccTTTTTTTTTACACACAATTC

Lo que estoy buscando es una vez que se imprime una salida, no quiero buscar patten coincidente en esos archivos de entrada nuevamente. Mi salida esperada

Test1.txt

NNNNNabcccTTTTTCTAGTCACGATAGCC
NNNNNabcccTTTTTTTTTACACACAATTC
NNNNNabcccTAAGACTGGCCCACAGCTGA
NNNNNabcccTACTTTTTTTAGTGATACAC
NNNNNabcccTAGACAGGGAATACTTTATT

Test2.txt

NNNNNaaabbCTAGTTTGTGTAGTAATTTT
NNNNNabbbbTTTTTTCACTACTGGGTTTC
NNNNNaaabbTTTTTGCAAAAAGTAATTTG
NNNNNaaabbTTTTTTTTTTTTTACTAGTG

Test3.txt

NNNNNabcabAAAAATCTAATCTGCCAGTT
NNNNNabcaaTTTTTTTTAATGGGTCTCAA
NNNNNabcaaTAGAGACGGGGTTTCACCAT
NNNNNabcaaTTTTTGTCGAAGATCTCACC
NNNNNabcabTTGGTAAACAGGCGGGTGTA
NNNNNabcabTTTTTTTTTCTTTCTGCCTG
NNNNNabcaaTTTTGAGACAGAATCTTGCT
NNNNNabcabGACAGGGAATACTTATATTC
awk
0
user3377241 10 may. 2019 a las 01:18

3 respuestas

La mejor respuesta

Para hacer los tres en un proceso awk, intente:

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

Aquí, print>"test1.txt" se imprime en el archivo test1.txt.

Tenga en cuenta que > significa algo diferente en awk de lo que significa en shell. En awk, como en shell, el primer print de un archivo sobrescribirá el contenido anterior del archivo. Sin embargo, a diferencia de Shell, las siguientes declaraciones awk print que usan > anexan al archivo.

Variación: imprimir solo en el primer archivo de salida coincidente

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

Aquí, cuando se encuentra una coincidencia, next le dice a awk que omita el resto de las pruebas y salte para comenzar de nuevo en la siguiente línea.

3
John1024 10 may. 2019 a las 17:20
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

Con GNU awk podría usar una instrucción switch en lugar de if s anidados.

2
Ed Morton 10 may. 2019 a las 03:34

Este golf supone que no hay partidos concurrentes.

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
0
vintnes 10 may. 2019 a las 02:35