Pesquisa de site

Como imprimir um intervalo de colunas usando o comando `awk`


O comando `awk` é um dos muitos comandos que podem ser usados para imprimir um intervalo de colunas de dados tabulares no Linux. O comando `awk` pode ser usado diretamente do terminal executando o arquivo de script `awk`. Neste tutorial, mostraremos como imprimir um intervalo de colunas a partir de dados tabulares.

Exemplo 1: imprimir um intervalo de colunas de uma saída de comando

O comando a seguir imprimirá a segunda, terceira e quarta colunas da saída do comando, ‘ls -l‘. Aqui, os números das colunas são declarados explicitamente, mas um comando mais eficiente para imprimir o mesmo intervalo de colunas é mostrado no próximo exemplo.

$ ls -l | awk '{ print $2, $3, $4 }'

A saída a seguir é produzida pelo comando acima.

Exemplo 2: imprima o intervalo de colunas de um arquivo usando um loop for

Para acompanhar este exemplo e os outros exemplos neste tutorial, crie um arquivo de texto chamado marks.txt com o seguinte conteúdo:

ID CSE203 CSE102 CSE202
1109 78 87 79
1167 67 81 70
1190 56 61 69
1156 89 55 78
199 54 66 58

O seguinte comando `awk` imprimirá as três primeiras colunas de marks.txt. O loop for é usado para imprimir os valores da coluna e o loop inclui três etapas. A variável NF indica o número total de campos ou colunas do arquivo.

$ cat marks.txt
$ awk '{for(i=1;i<=NF-1;i++) printf $i" "; print ""}' marks.txt

A saída a seguir será produzida executando o comando. A saída mostra os IDs dos alunos e as notas para CSE203 e CSE102.

Exemplo 3: Imprima o intervalo de colunas definindo variáveis iniciais e finais

O comando `awk` a seguir imprimirá as três primeiras colunas da saída do comando 'ls -l' inicializando as variáveis início e final. Aqui, o valor da variável inicial é 1 e o valor da variável final é 3. Essas variáveis são iteradas em um loop for para imprimir os valores da coluna.

$ ls -l | awk ' BEGIN { first = 1; last = 3 }
{ for (i = first; i < last; i++) { printf("%s ", $i) } print $last }'

A seguinte saída aparecerá após a execução do comando. A saída mostra os três primeiros valores de coluna da saída, ‘ls -l’.

Exemplo 4: imprimir um intervalo de colunas de um arquivo com formatação

O comando `awk` a seguir imprimirá as três primeiras colunas de marks.txt usando printf e o separador de campo de saída (OFS). Aqui, o loop for inclui três etapas e três colunas serão impressas em sequência a partir do arquivo. OFS é usado aqui para adicionar espaço entre as colunas. Quando o valor do contador do loop (i) for igual à variável final, então uma nova linha ( ) é gerado.

$ cat marks.txt
$ awk -v start=1 -v end=3 '{ for (i=start; i<=end;i++) printf("%s%s",
 $i,(i==end) ? "\n" : OFS) }'
marks.txt

A saída a seguir será gerada após a execução dos comandos acima.

Exemplo 5: imprimir o intervalo de colunas de um arquivo usando uma instrução condicional

O comando `awk` a seguir imprimirá a primeira e a última colunas de um arquivo usando um loop for e uma instrução if. Aqui, o loop for inclui quatro etapas. As variáveis inicial e final são usadas no script para omitir a segunda e terceira colunas do arquivo usando a condição if. A variável OFS é usada para adicionar espaço entre as colunas e a variável ORS é usada para adicionar uma nova linha ( ) após imprimir a última coluna.

$ cat marks.txt
$ awk -v start=2 -v end=3 '{ for (i=1; i<=NF;i++)
if( i>=start && i<=end) continue;
else printf("%s%s", $i,(i!=NF) ? OFS : ORS) }'
marks.txt

A seguinte saída aparecerá depois de executar os comandos acima. A saída mostra a primeira e a última colunas de marks.txt.

Exemplo 6: Imprima o intervalo de colunas de um arquivo usando a variável NF

O comando `awk` a seguir imprimirá a primeira e a última colunas do arquivo usando uma variável NF. Nenhum loop ou instrução condicional é usado para imprimir os valores da coluna. NF indica o número de campos. Existem quatro colunas em marks.txt. $ (NF-3) define a primeira coluna e $NF indica a última coluna.

$ cat marks.txt
$ awk '{print $(NF-3)" "$NF}' marks.txt

A saída a seguir é produzida executando os comandos acima. A saída mostra a primeira e a última colunas de marks.txt.

Exemplo 7: Imprima o intervalo de colunas de um arquivo usando substr() e index()

A função index() retorna uma posição se o valor do segundo argumento existir no valor do primeiro argumento. A função substr() pode receber três argumentos. O primeiro argumento é um valor de string, o segundo argumento é a posição inicial e o terceiro argumento é o comprimento. O terceiro argumento de substr() é omitido no comando a seguir. Como a coluna começa em $1 no comando `awk`, a função index() retornará $3 e o comando imprimirá de $3 a $4.

$ cat marks.txt
$ awk '{print substr($0,index($0,$3))}' marks.txt

A saída a seguir será produzida executando os comandos acima.

Exemplo 8: imprimir sequencialmente um intervalo de colunas de um arquivo usando printf

O seguinte comando `awk` imprimirá a primeira, segunda e terceira colunas de marks.txt definindo espaço suficiente para 10 caracteres.

$ cat marks.txt
$ awk '//{printf "%10s %10s %10s\n",$1,$3,$2 }' marks.txt

A saída a seguir será produzida executando os comandos acima.

Conclusão

Existem várias maneiras de imprimir o intervalo de colunas da saída do comando ou de um arquivo. Este tutorial mostra como o comando `awk` pode ajudar os usuários do Linux a imprimir conteúdo de dados tabulares.

Artigos relacionados: