Eu tentei a solução command | {head -1; sort; }
e posso confirmar que realmente estraga tudo - head
lê em várias linhas do pipe e, em seguida, gera apenas a primeira. Então, o resto da saída, que head
não leu, é passado para sort
- NÃO o resto da saída a partir da linha 2!
O resultado é que faltam linhas (e uma linha parcial!) que estavam no início da saída do seu comando (exceto que você ainda tem a primeira linha) - um fato que é fácil de confirmar adicionando um pipe a wc
no final do pipeline acima - mas isso é extraordinariamente difícil de rastrear se você não sabe disso! Eu gastei pelo menos 20 minutos tentando descobrir porque eu tinha uma linha parcial (primeiro 100 bytes ou algo assim cortado) na minha saída antes de resolvê-la.
O que acabei fazendo, que funcionou lindamente e não exigia a execução do comando duas vezes, foi:
myfile=$(mktemp)
whatever command you want to run > $myfile
head -1 $myfile
sed 1d $myfile | sort
rm $myfile
Se você precisar colocar a saída em um arquivo, poderá modificá-lo para:
myfile=$(mktemp)
whatever command you want to run > $myfile
head -1 $myfile > outputfile
sed 1d $myfile | sort >> outputfile
rm $myfile