¿Cuáles son las diferencias exactas entre awk y cut with grep? [cerrado]

30

Sabemos que podemos obtener la segunda columna de la línea que queremos de un archivo usando estas dos técnicas:

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

o

grep WORD filename| cut -f 2 -d ' '

Mis preguntas son:

  • ¿Cuáles son las diferencias entre los dos comandos anteriores?
  • ¿Cuál tiene el mejor rendimiento?
  • ¿Cuáles son las ventajas de usar awksobre usar cuty viceversa?
  • ¿Qué opciones awknos da cuty viceversa?
Networker
fuente
es eso echo filenameo cat filename?
Avinash Raj
@AvinashRaj lo siento editado
Networker

Respuestas:

35

La diferencia más destacada entre sus dos líneas dependería de la entrada. cuttoma un solo carácter -dcomo delimitador de campo (el valor predeterminado es TAB), y cada aparición de ese carácter comienza un nuevo campo. awkSin embargo, es más flexible. El separador está en la FSvariable y puede ser una cadena vacía (cada carácter de entrada forma un campo separado), un solo carácter o una expresión regular. El caso especial de un solo carácter de espacio (el valor predeterminado) significa dividir en cualquier secuencia de espacios en blanco. Además, awksuprime los espacios en blanco iniciales de forma predeterminada.

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

Aquí, se awkdivide en la secuencia de espacios entre abcy defmientras cuttoma cada espacio como separador.

Lo que tome dependerá de lo que quiera lograr. De lo contrario, esperaría cutser más rápido ya que es una herramienta más pequeña y de un solo propósito, mientras que awktiene su propio lenguaje de programación.

Dubu
fuente
que lo que quiero como respuesta, gracias marcaré la pregunta como respondida @Dubu
Networker
1
cutes probable que sea más rápido que Awk solo , pero no es tan seguro que grep ... | cutsea ​​más rápido que Awk puro.
Comodín el
8

En términos generales, cuanto más especializada es una herramienta, más rápida es. Entonces, en la mayoría de los casos, puede esperar cuty grepser más rápido que sed, y sedser más rápido que awk. Si está comparando tuberías más largas de herramientas más simples con una sola invocación de una herramienta más compleja, no hay una regla general. Esto solo importa con entradas grandes (digamos, millones de líneas); para entradas cortas, no verá ninguna diferencia.

La ventaja de las herramientas más complejas es, por supuesto, que pueden hacer más cosas.

Sus comandos usan gato innecesariamente. Utilice la redirección en su lugar (especialmente si está preocupado por la velocidad, aunque probablemente no debería preocuparse por la velocidad hasta que haya ejecutado puntos de referencia¹).

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

Estos comandos son casi equivalentes. Las diferencias son:

  • awk y grep tienen diferentes sintaxis regexp . Awk y grep -Etienen sintaxis regexp casi idénticas (expresiones regulares extendidas).
  • cut -d ' 'trata cada carácter espacial individual como un delimitador. El delimitador predeterminado de Awk es cualquier secuencia de espacios en blanco, que puede ser múltiples espacios, una pestaña, etc. No puede utilizar secuencias arbitrarias de espacios en blanco como separadores con cut. Para utilizar espacios individuales como separadores en awk, ajuste el separador de campo a una expresión regular que coincide con un solo espacio, que no sea una expresión regular que consiste en solo espacio (que es un caso especial que significa “cualquier secuencia de espacios en blanco”, es decir, el valor por defecto): awk -F '[ ]' '/WORD/ {print $2}'.

¹ La primera regla de optimización del programa: no lo hagas. La segunda regla de optimización de programas (¡solo para expertos!): No lo hagas todavía. - Michael A. Jackson

Gilles 'SO- deja de ser malvado'
fuente
1

Su comando,

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

Ni siquiera necesitas un catcomando. Puedes intentarlo

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

Y el siguiente comando redirige la salida de cat a grep y luego a cortar,

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

Lo más probable es que debamos evitar la redirección de salida. Awk hace el trabajo en una línea, pero cutnecesita un grepcomando para obtener solo las líneas que contienen una palabra en particular e imprime la columna 2 de acuerdo con el espacio delimitador.

Puede hacer las cosas en awk si el corte no lo hace.

Avinash Raj
fuente
3
PD: tampoco necesitas un comando cat para grep. Solo puedes hacer grep WORD filename.
phoops
@ edvinas.me sí.
Avinash Raj