awk Comando Loop

5
awk '{print $1 ,": "  $3}' Src.txt | column -t
awk '{for(x=2;$x;++x) print $1, $x "\n"}'  Src.txt | column -t

Estes comandos estão funcionando, mas a formatação não é apropriada ou eu só posso imprimir a coluna um e a coluna dois ou posso imprimir a coluna 1 seguida pela coluna 2 e pela coluna 3, mas o resultado desejado é

column 1 column 2
column 1 column 3
column 1 column 4 .....

Exemplo:

Col1  a b c
Col2  1 2 3  
col3  x y z

Saída

Col1 a
Col2 b
Col3 c

Col1 b
col2 2
Col3 y

Col1 c
Col2 3
Col3 z

Talvez seja necessário adicionar um loop adequado?

    
por arsh 26.06.2015 / 00:25

1 resposta

3

A maneira como o awk funciona é que, por padrão, ele percorre cada linha de texto e divide cada item separado por espaço em campos, nesse caso temos campos $ 2, $ 3 e $ 4 de juros. Agora, e se pudéssemos armazenar cada campo de $ 2 de cada linha em uma lista e depois imprimi-lo? É aí que as matrizes podem ajudar.

Tratando o corpo de um código awk como um grande loop while, podemos separar os campos 2,3 e 4 em matrizes apropriadas. Com cada linha, os arrays serão preenchidos. Então, basicamente, classificamos tudo em colunas (arrays) à medida que avançamos nas linhas. Uma vez feito isso, podemos passar por um loop imprimindo cada coluna (array) separadamente, enquanto apenas adicionando o texto "Column #".

$ awk '{ array1[NR]=$2;array2[NR]=$3;array3[NR]=$4} END{for(i=1;i<=NR;i++){print "Column"i" "array1[i]};printf "\n";for(i=1;i<=NR;i++){print "Column"i" "array2[i]}; printf"\n"; for(i=1;i<=NR;i++){print "Column"i" "array3[i] };printf "\n" }' columns.txt           
Column1 a
Column2 1
Column3 x

Column1 b
Column2 2
Column3 y

Column1 c
Column2 3
Column3 z

É claro que uma longa linha é um pouco difícil de usar (sem trocadilhos intencionais). Podemos colocar tudo em um script:

#!/usr/bin/awk -f

{ array1[NR]=$2;array2[NR]=$3;array3[NR]=$4 } 

END{
  for(i=1;i<=NR;i++){
     print "Column"i" "array1[i]};printf "\n";
   for(i=1;i<=NR;i++){
     print "Column"i" "array2[i]}; printf"\n"; 
   for(i=1;i<=NR;i++){
     print "Column"i" "array3[i] };printf "\n" 
}

Chame esse script columnate.awk , altere as permissões para executável com chmod +x columnate.awk e execute-o com qualquer arquivo de texto como parâmetro:

$ ./columnate.awk columns.txt                                                                                                                          
Column1 a
Column2 1
Column3 x

Column1 b
Column2 2
Column3 y

Column1 c
Column2 3
Column3 z
    
por 28.06.2015 / 22:37

Tags