Sabemos que podemos obter a segunda coluna da linha que queremos de um arquivo usando estas duas técnicas:
awk '/WORD/ { print $2 }' filename
ou
grep WORD filename| cut -f 2 -d ' '
Minhas perguntas são:
- Quais são as diferenças entre os dois comandos acima?
- Qual deles tem o melhor desempenho?
- Quais são as vantagens do uso
awk
excessivocut
e vice-versa? - Que opções
awk
nos dãocut
e vice-versa?
awk
grep
performance
cut
Networker
fonte
fonte
echo filename
oucat filename
?Respostas:
A diferença mais proeminente entre suas duas linhas seria dependendo da entrada.
cut
recebe um único caractere-d
como delimitador de campo (o padrão é TAB) e cada ocorrência única desse caractere inicia um novo campo.awk
, no entanto, é mais flexível. O separador está naFS
variável e pode ser uma sequência vazia (cada caractere de entrada cria um campo separado), um único caractere ou uma expressão regular. O caso especial de um caractere de espaço único (o padrão) significa dividir em qualquer sequência de espaço em branco. Além disso,awk
suprime o espaço em branco à esquerda por padrão.Por favor compare:
Aqui,
awk
divide-se na sequência de espaços entreabc
edef
considerandocut
ocupa todos os espaços como um separador.O que você toma dependerá do que você deseja alcançar. Caso contrário, eu esperaria
cut
ser mais rápido, já que é uma ferramenta menor e de propósito único, enquantoawk
possui sua própria linguagem de programação.fonte
cut
provavelmente será mais rápido que o Awk sozinho , mas não é tão certo quegrep ... | cut
será mais rápido que o Awk puro.De um modo geral, quanto mais especializada é uma ferramenta, mais rápida é. Portanto, na maioria dos casos, você pode esperar
cut
egrep
ser mais rápido quesed
esed
ser mais rápido queawk
. Se você compara pipelines mais longos de ferramentas mais simples com uma única chamada de uma ferramenta mais complexa, não há regra de ouro. Isso só importa com grandes entradas (digamos, milhões de linhas); para entradas curtas, você não verá nenhuma diferença.A vantagem de ferramentas mais complexas é que elas podem fazer mais coisas.
Seus comandos usam o gato desnecessariamente. Em vez disso, use o redirecionamento (especialmente se estiver preocupado com a velocidade, embora você provavelmente não deva se preocupar com a velocidade até executar os benchmarks¹).
Esses comandos são quase equivalentes. As diferenças são:
grep -E
tem sintaxes regexp quase idênticas (expressões regulares estendidas).cut -d ' '
trata cada caractere de espaço individual como um delimitador. O delimitador padrão do Awk é qualquer sequência de espaços em branco, que pode ser vários espaços, uma guia etc. Você não pode usar sequências arbitrárias de espaços em branco como separadorescut
. Para utilizar espaços individuais como separadores em awk, definir o separador de campos para uma expressão regular que corresponde a um único espaço, que não seja uma expressão regular que consiste de espaço único (que é um caso especial que significa “qualquer sequcia de espaços em branco”, isto é, o padrão):awk -F '[ ]' '/WORD/ {print $2}'
.¹ A primeira regra do Programa de Otimização: não fazê-lo. A Segunda Regra da Otimização de Programas (somente para especialistas!): Não faça isso ainda. - Michael A. Jackson
fonte
Seu comando,
Você nem precisa de um
cat
comando. Você pode tentar,E o comando abaixo redireciona a saída de cat para grep e depois para cut,
Muito provavelmente, devemos evitar o redirecionamento de saída. O Awk faz o trabalho em uma linha, mas
cut
precisa de umgrep
comando para obter apenas as linhas que contêm uma palavra específica e imprime a coluna 2 de acordo com o espaço delimitador.Você pode fazer as coisas no awk se o corte falhar.
fonte
grep WORD filename
.