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
awk
sobre usarcut
y viceversa? - ¿Qué opciones
awk
nos dacut
y viceversa?
awk
grep
performance
cut
Networker
fuente
fuente
echo filename
ocat filename
?Respuestas:
La diferencia más destacada entre sus dos líneas dependería de la entrada.
cut
toma un solo carácter-d
como delimitador de campo (el valor predeterminado es TAB), y cada aparición de ese carácter comienza un nuevo campo.awk
Sin embargo, es más flexible. El separador está en laFS
variable 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,awk
suprime los espacios en blanco iniciales de forma predeterminada.Por favor compare:
Aquí, se
awk
divide en la secuencia de espacios entreabc
ydef
mientrascut
toma cada espacio como separador.Lo que tome dependerá de lo que quiera lograr. De lo contrario, esperaría
cut
ser más rápido ya que es una herramienta más pequeña y de un solo propósito, mientras queawk
tiene su propio lenguaje de programación.fuente
cut
es probable que sea más rápido que Awk solo , pero no es tan seguro quegrep ... | cut
sea más rápido que Awk puro.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
cut
ygrep
ser más rápido quesed
, ysed
ser más rápido queawk
. 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¹).
Estos comandos son casi equivalentes. Las diferencias son:
grep -E
tienen 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 concut
. 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
fuente
Su comando,
Ni siquiera necesitas un
cat
comando. Puedes intentarloY el siguiente comando redirige la salida de cat a grep y luego a cortar,
Lo más probable es que debamos evitar la redirección de salida. Awk hace el trabajo en una línea, pero
cut
necesita ungrep
comando 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.
fuente
grep WORD filename
.