Quali sono le differenze esatte tra awk e cut con grep? [chiuso]


30

Sappiamo che possiamo ottenere la seconda colonna della riga che vogliamo da un file usando queste due tecniche:

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

o

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

Le mie domande sono:

  • Quali sono le differenze tra i due comandi sopra?
  • Quale ha le migliori prestazioni?
  • Quali sono i vantaggi dell'utilizzo awkrispetto all'utilizzo cute viceversa?
  • Quali opzioni awkci offre cute viceversa?

è quello echo filenameo cat filename?
Avinash Raj,

@AvinashRaj dispiace modificato
Networker,

Risposte:


35

La differenza più evidente tra le tue due linee dipenderà dall'input. cutaccetta un singolo carattere -dcome delimitatore di campo (l'impostazione predefinita è TAB) e ogni singola occorrenza di quel carattere avvia un nuovo campo. awk, tuttavia, è più flessibile. Il separatore si trova nella FSvariabile e può essere una stringa vuota (ogni carattere di input crea un campo separato), un singolo carattere o un'espressione regolare. Il caso speciale di un singolo carattere spazio (impostazione predefinita) significa dividere su qualsiasi sequenza di spazi bianchi. Inoltre, awkelimina i principali spazi bianchi per impostazione predefinita.

Si prega di confrontare:

$ 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

Qui, si awkdivide sulla sequenza di spazi tra abce defmentre cutprende ogni spazio come separatore.

Ciò che prendi dipende da ciò che vuoi ottenere. Altrimenti, mi aspetterei cutdi essere più veloce poiché è uno strumento più piccolo e monouso mentre awkha un suo linguaggio di programmazione.


quello che voglio come risposta, grazie segnerò la domanda come risposta @Dubu
Networker,

1
cutrischia di essere più veloce di Awk da solo , ma non è così certo che grep ... | cutsarà più veloce di Awk puro.
Wildcard il

8

In generale, più uno strumento è specializzato, più è veloce. Quindi, nella maggior parte dei casi, ci si può aspettare cute grepdi essere più veloce di sed, e sedper essere più veloce di awk. Se stai confrontando pipeline più lunghe di strumenti più semplici con una singola invocazione di uno strumento più complesso, non esiste una regola empirica. Questo conta solo con input di grandi dimensioni (diciamo, milioni di linee); per input brevi, non vedrai alcuna differenza.

Il vantaggio di strumenti più complessi è ovviamente che possono fare più cose.

I tuoi comandi usano cat inutilmente. Usa invece il reindirizzamento (soprattutto se sei preoccupato per la velocità, anche se probabilmente non dovresti preoccuparti della velocità fino a quando non avrai eseguito i benchmark¹).

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

Questi comandi sono quasi equivalenti. Le differenze sono:

  • awk e grep hanno sintassi regexp diverse . Awk e grep -Esintassi regexp quasi identiche (espressioni regolari estese).
  • cut -d ' 'tratta ogni singolo personaggio spaziale come un delimitatore. Il delimitatore predefinito di Awk è qualsiasi sequenza di spazi bianchi, che può essere più spazi, una scheda, ecc. Non è possibile utilizzare sequenze di spazi bianchi arbitrari come separatori con cut. Per utilizzare singoli spazi come separatori in awk, impostare il separatore di campo per un regexp che corrisponde a un unico spazio, diverso da un regexp costituito da unico spazio (che è un caso speciale che significa “qualsiasi sequenza spazio bianco”, cioè il valore predefinito): awk -F '[ ]' '/WORD/ {print $2}'.

¹ La prima regola di ottimizzazione del programma: non farlo. La seconda regola di ottimizzazione del programma (solo per esperti!): Non farlo ancora. - Michael A. Jackson


1

Il tuo comando,

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

Non hai nemmeno bisogno di un catcomando. Puoi provare,

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

E il comando seguente reindirizza l'output da cat a grep, quindi per tagliare,

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

Molto probabilmente dobbiamo evitare il reindirizzamento dell'output. Awk esegue il lavoro su una riga ma ha cutbisogno di un grepcomando per ottenere solo le righe che contengono una determinata parola e stampa la colonna 2 in base allo spazio del delimitatore.

Puoi fare le cose in awk se cut non riesce.


3
ps non hai nemmeno bisogno di un comando cat per grep. Puoi solo fare grep WORD filename.
phoops,

@ edvinas.me sì.
Avinash Raj,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.