Quelles sont les différences exactes entre awk et cut with grep? [fermé]

30

Nous savons que nous pouvons obtenir la deuxième colonne de la ligne que nous voulons à partir d'un fichier en utilisant ces deux techniques:

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

ou

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

Mes questions sont:

  • Quelles sont les différences entre les deux commandes ci-dessus?
  • Lequel a les meilleures performances?
  • Quels sont les avantages de l'utilisation par awkrapport à l'utilisation cut, et vice versa?
  • Quelles options awknous offrent-ils cutet vice versa?
Networker
la source
c'est echo filenameou cat filename?
Avinash Raj
@AvinashRaj désolé modifié
Networker

Réponses:

35

La différence la plus importante entre vos deux lignes dépend de l'entrée. cutprend un seul caractère -dcomme délimiteur de champ (la valeur par défaut étant TAB), et chaque occurrence unique de ce caractère démarre un nouveau champ. awkest cependant plus flexible. Le séparateur est dans la FSvariable et peut être une chaîne vide (chaque caractère d'entrée crée un champ séparé), un seul caractère ou une expression régulière. Le cas particulier d'un seul caractère d'espace (par défaut) signifie la division sur n'importe quelle séquence d'espaces. Supprime également les awkespaces blancs de début par défaut.

Veuillez comparer:

$ 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

Ici, awkse divise sur la séquence d'espaces entreabc et deftandis que cutprend chaque espace comme séparateur.

Ce que vous prenez dépendra de ce que vous voulez réaliser. Sinon, je m'attendrais cutà être plus rapide car c'est un outil plus petit et à usage unique alors qu'il awka son propre langage de programmation.

Dubu
la source
que ce que je veux comme réponse, merci je marquerai la question comme répondue @Dubu
Networker
1
cutest susceptible d'être plus rapide que Awk seul , mais il n'est pas certain que ce grep ... | cutsera plus rapide que Awk pur.
Wildcard
8

De manière générale, plus un outil est spécialisé, plus il est rapide. Donc, dans la plupart des cas, vous pouvez vous attendre cutet grepêtre plus rapide que sed, et sedêtre plus rapide queawk . Si vous comparez des pipelines plus longs d'outils plus simples avec une seule invocation d'un outil plus complexe, il n'y a pas de règle d'or. Cela ne concerne que les entrées importantes (par exemple, des millions de lignes); pour les entrées courtes, vous ne verrez aucune différence.

L'avantage des outils plus complexes est bien sûr qu'ils peuvent faire plus de choses.

Vos commandes utilisent inutilement cat. Utilisez plutôt la redirection (surtout si vous êtes préoccupé par la vitesse, même si vous ne devriez probablement pas vous inquiéter de la vitesse tant que vous n'avez pas effectué de tests de performance¹).

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

Ces commandes sont presque équivalentes. Les différences sont les suivantes:

  • awk et grep ont des syntaxes d'expression rationnelle différentes . Awk et grep -Eont des syntaxes regexp presque identiques (expressions régulières étendues).
  • cut -d ' 'traite chaque caractère d'espace individuel comme un délimiteur. Le délimiteur par défaut d'Awk est n'importe quelle séquence d'espaces blancs, qui peut être plusieurs espaces, un onglet, etc. Vous ne pouvez pas utiliser des séquences d'espaces arbitraires comme séparateurs avec cut. Pour utiliser des espaces individuels comme séparateurs dans awk, régler le séparateur de champ à une expression rationnelle qui correspond à un seul espace, autre qu'une expression rationnelle , comprenant un espace unique ( ce qui est un cas spécial signifiant « toute séquence d'espaces blancs », à savoir la valeur par défaut): awk -F '[ ]' '/WORD/ {print $2}'.

¹ La première règle d'optimisation de programme: ne le faites pas. La deuxième règle de l'optimisation des programmes (pour les experts seulement!): Ne le faites pas encore. - Michael A. Jackson

Gilles, arrête de faire le mal
la source
1

Votre commande,

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

Vous n'avez même pas besoin d'une catcommande. Vous pouvez essayer,

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

Et la commande ci-dessous redirige la sortie de cat vers grep puis vers cut,

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

Nous devons très probablement éviter la redirection de sortie. Awk fait le travail sur une seule ligne mais a cutbesoin d'une grepcommande pour obtenir uniquement les lignes qui contiennent un mot particulier et il imprime la colonne 2 en fonction de l'espace du délimiteur.

Vous pouvez faire les choses dans awk si cut ne parvient pas à le faire.

Avinash Raj
la source
3
ps vous n'avez pas besoin non plus d'une commande cat pour grep. Vous pouvez simplement faire grep WORD filename.
phoops
@ edvinas.me yep.
Avinash Raj