altera e manipula linhas em um arquivo usando o awk

1

Eu tenho um arquivo com o seguinte formato

>M03117:162:000000000-ATLWF:1:1114:22047:12565:307
TCCGAAAGT-ACAACGTGT
>M03117:162:000000000-ATLWF:1:2104:9367:8166:307
TTCGAAAGTT-GGTGAGGTGTGGG
>M03117:162:000000000-ATLWF:1:1119:11492:8271:307
TCCGAAAGTTCTCCGA-CTTGGCTTCCTAG
>M03117:162:000000000-ATLWF:1:2111:19039:8200:307
GACGAAAGTTCACCGATA-GAGGTAGAAGGTGCAGTGGGGA

Eu gostaria de manipular e alterar as linhas para que a segunda linha seja dividida em duas separadas por "-" para uma nova linha e o nome antes de ser identificado por ">" copiado na nova linha e renomeado por _2 no final do nome, como segue:

>M03117:162:000000000-ATLWF:1:1114:22047:12565:307
TCCGAAAGT
>M03117:162:000000000-ATLWF:1:1114:22047:12565:307_2
ACAACGTGT
>M03117:162:000000000-ATLWF:1:2104:9367:8166:307
TTCGAAAGTT
>M03117:162:000000000-ATLWF:1:2104:9367:8166:307_2
GGTGAGGTGTGGG
>M03117:162:000000000-ATLWF:1:1119:11492:8271:307
TCCGAAAGTTCTCCGA
>M03117:162:000000000-ATLWF:1:1119:11492:8271:307_2
CTTGGCTTCCTAG
>M03117:162:000000000-ATLWF:1:2111:19039:8200:307
GACGAAAGTTCACCGATA
>M03117:162:000000000-ATLWF:1:2111:19039:8200:307_2
GAGGTAGAAGGTGCAGTGGGGA

Eu sei que isso pode ser feito pelo awk, mas não consigo fazer nada.

    
por alex kiarie 14.07.2017 / 13:52

4 respostas

1

Perl para o resgate

perl -laF/-/ -ne '
    if (/^>/) { print; $header = "$_\_2"; }
    else { print join "\n", $F[0], $header, $F[1] }
' -- input-file
  • -n lê a linha de entrada por linha
  • -l remove novas linhas da entrada e as adiciona a print instruções
  • -aF/-/ divide a entrada em -

Ao ler uma linha de cabeçalho, ela sai e armazena o cabeçalho para uso posterior. Ao processar uma sequência, ela imprime a primeira parte, o cabeçalho armazenado e a segunda parte.

    
por 14.07.2017 / 14:03
2

Desde que você perguntou especificamente sobre "usando o awk"

awk -F- '
  /^>/ {hdr=$0; next} 
  {print hdr ORS $1; for(i=2;i<=NF;i++) print hdr"_"i ORS $i}
' file
    
por 14.07.2017 / 15:05
2

Capture linhas que começam com > em header e vão para next registro de entrada para processamento adicional. Que imprima uma linha com o header a \n e coluna 1 do novo registro de entrada. Do que repetir isso para a segunda coluna e adicionar 2 ao seu cabeçalho.

$ awk -F- '/^>/{header=$0; next}{print header ORS $1; print header"_2" ORS $2}' file
>M03117:162:000000000-ATLWF:1:1114:22047:12565:307
TCCGAAAGT
>M03117:162:000000000-ATLWF:1:1114:22047:12565:307_2
ACAACGTGT
>M03117:162:000000000-ATLWF:1:2104:9367:8166:307
TTCGAAAGTT
>M03117:162:000000000-ATLWF:1:2104:9367:8166:307_2
GGTGAGGTGTGGG
>M03117:162:000000000-ATLWF:1:1119:11492:8271:307
TCCGAAAGTTCTCCGA
>M03117:162:000000000-ATLWF:1:1119:11492:8271:307_2
CTTGGCTTCCTAG
>M03117:162:000000000-ATLWF:1:2111:19039:8200:307
GACGAAAGTTCACCGATA
>M03117:162:000000000-ATLWF:1:2111:19039:8200:307_2
GAGGTAGAAGGTGCAGTGGGGA
    
por 14.07.2017 / 15:57
1

Se você gosta de se ajudar, mas não quer aprender programação, você pode fazer coisas assim com sed . Você simplesmente sempre lê a próxima linha com N , separa a linha dupla em suas partes cercadas por () e combina as partes referidas como para a primeira e assim por diante, conforme necessário:

sed -E 'N;s/(.*)(\n)(.*)-(.*)/_2/' file

Você também pode fazer isso sem expressões regulares estendidas (sem opção -E ), mas você pode se perder em barras invertidas:

sed 'N;s/\(.*\)\(\n\)\(.*\)-\(.*\)/_2/' file

O mesmo resultado, obtido pelo uso de buffer de reserva, mas não tão óbvio se você for novo em sed :

sed 'h;n;y/-/\n/;P;s/.*\n//;x;s/$/_2/;G' file
    
por 14.07.2017 / 15:23