Neste caso específico, a segunda opção é a melhor.
Em geral, é mais eficiente minimizar o número de utilitários em um pipeline. É melhor não bifurcar (iniciar) processos desnecessários (como no seu primeiro exemplo com um processo sed
desnecessário). Na Internet, não é difícil encontrar exemplos de reclamações sobre usos inúteis do gato .
Com a maioria dos sistemas modernos do tipo Unix * , o bifurcação é realizado de forma bastante eficiente, mas depende do tamanho do processo iniciado, por exemplo, o lançamento perl
ou python
seria muito mais lento que sed
ou awk
.
Para comandos únicos, isso não importa muito, mas se o pipeline estiver dentro de um loop e estiver sendo executado várias vezes, a remoção do processo desnecessário do pipeline poderá acelerar bastante o tempo de execução total.
Perguntas específicas
Why should I run either one?
Se você está mais familiarizado com a sintaxe de um sobre o outro, pode ser melhor para legibilidade do código (e capacidade de manutenção) para usar a ferramenta / idioma seu mais familiarizado com.
Should I use a different tool?
Neste caso específico, eu não penso assim. Ambos awk
e sed
são
ferramentas apropriadas para este tipo de trabalho.
What factors should I be considering?
Se você precisar processar vários arquivos (por exemplo, em um loop), a velocidade / eficiência seria importante.
Se você está processando apenas um arquivo grande, de vez em quando, a legibilidade do código pode ser mais importante.
How can I test those factors?
Você pode criar perfis de versões diferentes usando o utilitário time
, disponível como shell interno com o Bash, mas também como um programa executável autônomo. Por exemplo. executar os dois comandos de exemplo mostra que o primeiro exemplo levou 0,012s a mais do que o segundo.
$ time echo "foo\nbar\nbaz" | sed 1q | awk '{ print $0 " cats" }'
foo\nbar\nbaz cats
real 0m0.056s
user 0m0.000s
sys 0m0.045s
$ time echo "foo\nbar\nbaz" | awk 'NR == 1 { print $0 " cats" }'
foo\nbar\nbaz cats
real 0m0.044s
user 0m0.000s
sys 0m0.031s
Observe que as comparações de desempenho do perfil são afetadas pela carga do sistema e por outros fatores limitantes, portanto, é necessário repetir isso várias vezes para obter uma imagem real de qual versão é mais rápida do que a outra.
* Com o MS Windows, o forking é mais caro, portanto, minimizar o número de processos iniciados faz diferença ao ser executado em ambientes como o Cygwin.