Manipulação de coluna usando o AWK

4

Eu tenho um arquivo com mais de 200 colunas. Como por exemplo propósito, estou aqui usando um arquivo com menor número de colunas (9). Abaixo está o arquivo de entrada (algumas linhas)

chr10   181243  225933  1   1   1   10  0   36
chr10   181500  225933  1   1   1   106 0   35
chr10   226069  255828  1   1   1   57  0   37
chr10   243946  255828  1   1   1   4   0   27
chr10   255989  267134  1   1   1   87  0   32
chr10   255989  282777  1   1   1   61  0   34
chr10   267297  282777  1   1   1   61  0   37
chr10   282856  283524  1   1   1   92  0   35
chr10   282856  285377  1   1   1   1   0   15
chr10   283618  285377  1   1   1   72  0   33

Eu quero reorganizar o arquivo de forma que minha última coluna (aqui a 9ª coluna) seja a quarta coluna no arquivo de saída e depois imprimir todo o resto. Então, a saída que estou procurando é

chr10   181243  225933  36  1   1   1   10  0
chr10   181500  225933  35  1   1   1   106 0
chr10   226069  255828  37  1   1   1   57  0
chr10   243946  255828  27  1   1   1   4   0
chr10   255989  267134  32  1   1   1   87  0
chr10   255989  282777  34  1   1   1   61  0
chr10   267297  282777  37  1   1   1   61  0
chr10   282856  283524  35  1   1   1   92  0
chr10   282856  285377  15  1   1   1   1   0
chr10   283618  285377  33  1   1   1   72  0

Em um arquivo com menos colunas, posso usar algo assim para obter a saída acima:

awk -v OFS="\t" '{print $1,$2,$3,$9,$4,$5,$6,$7,$8}'

Se agora eu tiver um arquivo com um grande número de colunas, como posso colocar a última coluna do arquivo como a quarta coluna e como posso imprimir como está?

    
por user3138373 13.09.2018 / 21:35

2 respostas

7

Perl é muito conciso para isso: dividir cada linha em palavras, retirar a última palavra e inseri-la em  índice 3 (baseado em 0)

$ perl -lane 'splice @F, 3, 0, pop(@F); print "@F"' file | column -t
chr10  181243  225933  36  1  1  1  10   0
chr10  181500  225933  35  1  1  1  106  0
...
    
por 13.09.2018 / 22:16
4

Para substituir o quarto campo pelo último campo:

awk -v OFS="\t" '{ $4 = $NF; $NF=""; print }

Para inserir o último campo antes do quarto campo, precisamos criar um pouco de criatividade:

awk -v OFS="\t" '{temp=$NF; for( i=NF;i>4;i-- ) {$i=$(i-1)}; $4=temp  ; print}'

Isso preservará o campo final, percorrerá todos os campos e moverá cada um de volta para o quarto anterior, e então colocará o quarto campo desejado no lugar:

$ echo {1..10} | awk -v OFS="\t" '{temp=$NF; for( i=NF;i>4;i-- ) {$i=$(i-1)}; $4=temp  ; print}'
1   2   3   10  4   5   6   7   8   9
    
por 13.09.2018 / 21:39

Tags