Quais são as diferenças exatas entre awk e cut with grep? [fechadas]

30

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 awkexcessivo cute vice-versa?
  • Que opções awknos dão cute vice-versa?
Networker
fonte
é isso echo filenameou cat filename?
Avinash Raj
@AvinashRaj desculpe editada
Networker

Respostas:

35

A diferença mais proeminente entre suas duas linhas seria dependendo da entrada. cutrecebe um único caractere -dcomo 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á na FSvariá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, awksuprime o espaço em branco à esquerda por padrão.

Por favor compare:

$ echo "abc def" | cut -f 2 -d ' '
def
$ echo "abc    def" | cut -f 2 -d ' '

$ echo " abc def" | cut -f 2 -d ' '
abc


$ echo "abc def" | awk '{ print $2 }'
def
$ echo "abc    def" | awk '{ print $2 }'
def
$ echo " abc def" | awk '{ print $2 }'
def

Aqui, awkdivide-se na sequência de espaços entre abce defconsiderando cutocupa todos os espaços como um separador.

O que você toma dependerá do que você deseja alcançar. Caso contrário, eu esperaria cutser mais rápido, já que é uma ferramenta menor e de propósito único, enquanto awkpossui sua própria linguagem de programação.

Dubu
fonte
que o que eu quero como resposta, obrigado vou marcar a pergunta como respondida @Dubu
Networker
11
cutprovavelmente será mais rápido que o Awk sozinho , mas não é tão certo que grep ... | cutserá mais rápido que o Awk puro.
Curinga
8

De um modo geral, quanto mais especializada é uma ferramenta, mais rápida é. Portanto, na maioria dos casos, você pode esperar cute grepser mais rápido que sede sedser mais rápido que awk. 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¹).

<fileName awk '/WORD/ { print $2 }'
<fileName grep WORD | cut -f 2 -d ' '

Esses comandos são quase equivalentes. As diferenças são:

  • awk e grep têm diferentes sintaxes regexp . Awk e grep -Etem 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 separadores cut. 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

Gilles 'SO- parar de ser mau'
fonte
1

Seu comando,

cat fileName | awk '/WORD/ { print $2 }'

Você nem precisa de um catcomando. Você pode tentar,

awk '/WORD/ { print $2 }' filename

E o comando abaixo redireciona a saída de cat para grep e depois para cut,

cat fileName | grep WORD | cut -f 2 -d ' '

Muito provavelmente, devemos evitar o redirecionamento de saída. O Awk faz o trabalho em uma linha, mas cutprecisa de um grepcomando 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.

Avinash Raj
fonte
3
ps você também não precisa de um comando cat para grep. Você pode apenas fazer grep WORD filename.
phoops 28/05
@ edvinas.me sim.
Avinash Raj