Como esse awk alinha o espaçamento?

2

Alguém por favor pode me dizer o que isso faz?

cat infile|
awk ' 
{
 for(i=3;i<=NF;i++){ $2=$2" "$i } 
 printf "%-4s %s\n", $1,$2 ; 
}' > outfile.txt    

infile contém:

1 John Smith  
2 Bill Johnson  
...
5000 George Heiz  

Vejo que o resultado é que outfile.txt tem todas as linhas alinhadas, mas não entendo como você Especificamente, o que essa parte for(i=3;i<=NF;i++){ $2=$2" "$i } faz?

    
por Jim 14.09.2013 / 22:49

3 respostas

2

Com esses scripts awk , sempre acho melhor dividi-los para que eu possa ver o que está acontecendo.

printf

Este é fácil. Isso é formatar a saída das colunas originais $1 e $2 para que a coluna $1 seja preenchida para ocupar 4 espaços.

Exemplo

$ cat infile | awk ' 
{
 for(i=3;i<=NF;i++){ $2=$2" "$i } 
 printf "%-4s DDD\n", $1 ; 
}'
1    DDD
2    DDD
     DDD
5000 DDD

para loop

Este é um pouco mais complicado de detectar, mas ele está usando colunas de 3 ou mais e concatenando-as para a coluna $2 .

$ cat infile | awk ' 
{
 for(i=3;i<=NF;i++){ $2=$2" "$i } 
 printf "%s | %s\n", $2,$3 ; 
}'
John Smith | Smith
Bill Johnson | Johnson
 | 
George Heiz | Heiz

Isso é um pouco mais fácil, mas, na verdade, se adicionarmos uma quarta coluna a infile , é mais óbvio:

$ cat infile 
1 John Smith 4thcol
2 Bill Johnson 4thcol

5000 George Heiz 4thcol

Exemplo

$ cat infile | awk ' 
{
 for(i=3;i<=NF;i++){ $2=$2" "$i } 
 printf "%s\t|\t%s\n", $2,$3 ; 
}'
John Smith 4thcol   |   Smith
Bill Johnson 4thcol |   Johnson
    |   
George Heiz 4thcol  |   Heiz

Se adicionarmos um 5thcol e assim por diante, eles continuarão sendo adicionados a $2 .

    
por 14.09.2013 / 23:10
3

Este script awk é uma maneira complicada e ineficiente de fazer o que pode ser reescrito dessa maneira:

awk '
{
 f=$1
 $1=""
 printf "%4d %s\n",f,$0 ;
}' infile > outfile.txt

Este último script registra na variável f o primeiro campo, depois o limpa, depois imprime a variável f alinhada em quatro caracteres, seguida pelo restante da linha original inalterada.

Eu acho que o autor não descobriu como formatar o primeiro campo enquanto mantém o resto do registro sozinho e então coloca todos os campos restantes no segundo com o loop ímpar.

Editar:

Existe até uma maneira mais simples sugerida pelo rici:

awk '{$1 = sprintf("%4d", $1); print}' infile > outfile.txt

Este simplesmente substitui o primeiro campo por sua representação formatada e produz a linha.

    
por 15.09.2013 / 01:45
2

Você tem os comandos de formatação em printf como a primeira string de argumento. %-4s indica a saída a ser alocada 4 caracteres e alinhada à esquerda. Então, há um espaço, seguido pela string, indicada por %s .

    
por 14.09.2013 / 22:53

Tags