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

23

Sabemos que podemos obter a segunda coluna da linha que queremos de um arquivo usando essas 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 de usar awk usando cut e vice-versa?
  • Quais opções o awk nos oferece sobre cut e vice-versa?
por Networker 28.05.2014 / 08:46

3 respostas

25

A diferença mais importante entre suas duas linhas seria dependendo da entrada. cut usa um único caractere em -d como delimitador de campo (o padrão é TAB) e cada ocorrência desse caractere inicia um novo campo. awk , no entanto, é mais flexível. O separador está na variável FS e pode ser uma cadeia vazia (cada caractere de entrada faz um campo separado), um caractere único ou uma expressão regular. O caso especial de um único caractere de espaço (o padrão) significa dividir em qualquer seqüência de espaço em branco. Além disso, awk suprime o espaço em branco inicial 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, awk divide a sequência de espaços entre abc e def , enquanto cut considera cada espaço como um separador.

O que você toma depende do que você deseja alcançar. Caso contrário, eu esperaria que o cut fosse mais rápido, pois é uma ferramenta menor e única, enquanto awk tem sua própria linguagem de programação.

    
por 28.05.2014 / 09:45
6
Em geral, quanto mais especializada é uma ferramenta, mais rápido ela é. Portanto, na maioria dos casos, você pode esperar que cut e grep sejam mais rápidos que sed e sed seja mais rápido que awk . Se você compilar mais pipelines de ferramentas mais simples com uma única invocação de uma ferramenta mais complexa, não existe uma regra prática. 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 é, claro, que elas podem fazer mais coisas.

Seus comandos usam o gato desnecessariamente. Use o redirecionamento (especialmente se você estiver preocupado com a velocidade, embora você provavelmente não deva se preocupar com velocidade até ter executado 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 de regexp . Awk e grep -E possuem 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 seqüência de espaço em branco, que pode ser vários espaços, uma tabulação, etc. Você não pode usar sequências de espaços em branco arbitrários como separadores com cut . Para usar espaços individuais como separadores no awk, defina o separador de campo como um regexp que corresponda a um único espaço, diferente de um regexp que consiste em espaço único (que é um caso especial que significa “qualquer sequência de espaço em branco”): awk -F '[ ]' '/WORD/ {print $2}' .

¹ A primeira regra de otimização de programas: não faça isso. A segunda regra de otimização de programas (somente para especialistas!): Não faça isso ainda. - Michael A. Jackson

    
por 29.05.2014 / 04:34
1

Seu comando,

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

Você nem precisa do comando cat . Você pode tentar,

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

E o comando abaixo redireciona a saída do gato para o grep e depois para o corte

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

Provavelmente, devemos evitar o redirecionamento de saída. O awk faz o trabalho em uma linha, mas cut precisa de um comando grep para obter apenas as linhas que contêm uma determinada palavra e imprime a coluna 2 de acordo com o espaço do delimitador.

Você pode fazer as coisas no awk se o corte não funcionar.

    
por 28.05.2014 / 08:51