manipulação do awk

1

Eu tenho um arquivo como este

SRR959756.1081725       1       RNU2-54P:112:133:hsa-miR-1246
SRR959756.1162547       1       RNU2-54P:112:133:hsa-miR-1246
SRR959756.128602        2       RNU2-37P:85:108:hsa-miR-877-3p  RNU2-59P:99:122:hsa-miR-877-3p

Este é um arquivo separado por tabulação onde eu quero o resultado como este

SRR959756.1081725       1       RNU2-54P:112:133:hsa-miR-1246
SRR959756.1162547       1       RNU2-54P:112:133:hsa-miR-1246
SRR959756.128602        2       RNU2-37P:85:108:hsa-miR-877-3p  
SRR959756.128602        2       RNU2-59P:99:122:hsa-miR-877-3p

Então, como na terceira linha eu tenho 3ª e 4ª colunas. Mas a 1ª e a 2ª coluna devem sempre ser impressas e depois a 3ª coluna, depois a próxima linha 1ª e 2ª coluna e depois a 4ª coluna.

Como posso fazer isso no awk

    
por user3138373 23.01.2015 / 21:30

2 respostas

2

$ awk -v OFS='\t' '{for (i=3;i<=NF;i++)print $1,$2,$i}' file
SRR959756.1081725       1       RNU2-54P:112:133:hsa-miR-1246
SRR959756.1162547       1       RNU2-54P:112:133:hsa-miR-1246
SRR959756.128602        2       RNU2-37P:85:108:hsa-miR-877-3p
SRR959756.128602        2       RNU2-59P:99:122:hsa-miR-877-3p

Como funciona

  • -v OFS='\t'

    Isso define o separador de campo de saída, AKA OFS , como uma guia.

  • for (i=3;i<=NF;i++) print $1,$2,$i

    Isso executa um loop começando com a coluna 3 e todas as colunas depois e as imprime em uma linha precedida pelas colunas 1 e 2.

por 23.01.2015 / 21:32
1
awk '{print $1,$2,$3}$4{print $1,$2,$4}'

==

awk '{print $1,$2,$3;$3="\b"}$4'

ou

awk -v OFS="\t" '$4{$4="\n"$1"\t"$2"\t"$4}1'

==

awk -v OFS="\t" '$4{sub("^","\n"$1"\t"$2"\t",$4)}1'

Se você quiser uma saída formatada, pode usar a variável OFS em -v OFS='\t' ou a saída de canal via column -t

    
por 23.01.2015 / 21:34

Tags