web-dev-qa-db-fra.com

Imprimer le reste des champs dans awk

Supposons que nous ayons ce fichier de données.

john 32 maketing executive
jack 41 chief technical officer
jim  27 developer
dela 33 assistant risk management officer

Je veux imprimer en utilisant awk

john maketing executive
jack chief technical officer
jim  developer
dela assistant risk management officer

Je sais que cela peut être fait en utilisant for.

awk '{printf $1;  for(i=3;i<NF;i++){printf " %s", $i} printf "\n"}' < file

Le problème est long et semble complexe.

Existe-t-il un autre moyen court pour imprimer reste des champs.

26
Shiplu Mokaddim

Définissez le ou les champs que vous souhaitez ignorer:

awk '{$2 = ""; print $0;}' < file_name

Source: en utilisant awk pour imprimer toutes les colonnes du nième au dernier

46
Barun

De manière fiable avec GNU awk pour gensub () lors de l'utilisation du FS par défaut:

$ gawk -v delNr=2 '{$0=gensub("^([[:space:]]*([^[:space:]]+[[:space:]]+){"delNr-1"})[^[:space:]]+[[:space:]]*","\\1","")}1' file
john maketing executive
jack chief technical officer
jim  developer
dela assistant risk management officer

Avec d'autres awks, vous devez utiliser match () et substr () au lieu de gensub (). Notez que la variable delNr ci-dessus indique à awk le champ que vous souhaitez supprimer:

$ gawk -v delNr=3 '{$0=gensub("^([[:space:]]*([^[:space:]]+[[:space:]]+){"delNr-1"})[^[:space:]]+[[:space:]]*","\\1","")}1' file
john 32 executive
jack 41 technical officer
jim  27
dela 33 risk management officer

Ne faites pas cela:

awk '{sub($2 OFS, "")}1'

comme le même texte qui est dans $ 2 peut être à la fin de $ 1, et/ou $ 2 peut contenir des métacaractères RE donc il y a de fortes chances que vous supprimiez la mauvaise chaîne de cette façon.

Ne faites pas cela:

awk '{$2=""}1' file

car il ajoute un FS et compressera tous les autres espaces blancs contigus entre les champs en un seul caractère vide chacun.

Ne faites pas cela:

awk '{$2="";sub("  "," ")}1' file

car il a le problème de compression d'espace mentionné ci-dessus et repose sur un FS d'un seul blanc codé en dur (par défaut, donc peut-être pas si mal)) mais plus important encore s'il y avait des espaces avant 1 $, il en supprimerait un au lieu de l'espace qu'il ajoute entre 1 $ et 2 $.

Une dernière chose à noter est que dans les versions récentes de gawk, il existe une nouvelle fonction nommée patsplit () qui fonctionne comme split () MAIS en plus de créer un tableau des champs, elle crée également un tableau des espaces entre les champs. Cela signifie que vous pouvez manipuler les champs et les espaces entre eux dans les tableaux afin que vous n'ayez pas à vous soucier de la recompilation de l'enregistrement à l'aide d'OFS si vous manipulez un champ. Ensuite, il vous suffit d'imprimer les champs que vous souhaitez à partir des tableaux. Voir patsplit () dans http://www.gnu.org/software/gawk/manual/gawk.html#String-Functions pour plus d'informations.

8
Ed Morton

Vous pouvez utiliser un awk simple comme celui-ci:

awk '{$2=""}1' file

Cependant cela aura un OFS supplémentaire dans votre sortie qui peut être évité par cet awk

awk '{sub($2 OFS, "")}1' file

OU sinon en utilisant ce combo tr and cut:

Sous Linux:

tr -s ' ' < file | cut -d ' ' -f1,f3-

Sous OSX:

tr -s ' ' < file | cut -d ' ' -f1 -f3-
5
anubhava

Cela supprime le fichier n ° 2 et nettoie l'espace supplémentaire.

awk '{$2="";sub("  "," ")}1' file
4
Jotne

Une autre façon consiste à utiliser sed pour remplacer les premiers chiffres et la correspondance d'espace:

sed 's|[0-9]\+\s\+||' file

3
konsolebox