Imprime colunas no awk pelo nome do cabeçalho

6

Eu tenho um arquivo de texto assim

foo bar baz
1   a   alpha
2   b   beta
3   c   gamma

Eu posso usar o awk para imprimir certas colunas, como 1 e 3, com {print $1, $3} , mas quero especificar as colunas para imprimir, especificando o cabeçalho da coluna, algo como {print $foo, $baz} . Isso é útil, portanto não preciso abrir o arquivo e contar as colunas manualmente para ver qual coluna é qual, e não preciso atualizar o script se o número da coluna ou o pedido forem alterados. Posso fazer isso com o awk (ou outra ferramenta de shell)?

    
por user1350864 18.04.2017 / 16:19

1 resposta

8

awk '
NR==1 {
    for (i=1; i<=NF; i++) {
        f[$i] = i
    }
}
{ print $(f["foo"]), $(f["baz"]) }
' file
foo baz
1 alpha
2 beta
3 gamma

Esse é um idioma imensamente útil. Eu tenho muitos dados em planilhas e diferentes planilhas podem ter um subconjunto comum de colunas nas quais estou interessado, mas não necessariamente na mesma ordem em todas as planilhas ou com o mesmo número de outras colunas antes / entre elas para poder exportar -los como CSV ou similar e, em seguida, simplesmente executar um script awk usando os nomes das colunas em vez de números de coluna é absolutamente inestimável.

    
por 18.04.2017 / 16:21