Classificar a saída do awk, exceto a primeira linha?

5

Este é um caso de uso em que estou continuamente trabalhando na análise de arquivos CSV. Quando se trata de um script awk incorporado em um script de shell, posso usar esta solução alternativa:

myfile="$(mktemp)"
awk '(awk script here)' > "$myfile"
head -1 "$myfile"
sed 1d "$myfile" | sort
rm "$myfile"

(Ou usando o modelo mktemp apropriado para o BSD mktemp; o GNU funciona como acima).

No entanto, ao escrever um script awk completo com um shebang #!/bin/awk -f , não quero ter que alterá-lo para um shell script apenas para lidar com esse fator de classificação da saída.

Como posso fazer isso no awk? Ou, se não houver nenhuma função de classificação nativa no awk, onde posso aprender sobre pipelines awk e como posso usar pipelines para realizar isso sem alterar o shebang?

    
por Wildcard 17.11.2015 / 04:58

1 resposta

6

Aqui está um exemplo que classifica todas as linhas, mas a primeira:

#!/bin/awk -f
BEGIN{cmd="sort"}
NR==1{print;next}
{print $1,$2 | cmd}
END{close(cmd)}

Exemplo

Considere este arquivo:

$ cat file
Letter  Value
A       12
D       10
C       15
B       13

Então:

$ awk -f script.awk file
Letter  Value
A 12
B 13
C 15
D 10

A primeira linha de entrada é a primeira linha de saída. As linhas restantes são classificadas.

    
por 17.11.2015 / 05:12