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.
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
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.
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-
Cela supprime le fichier n ° 2 et nettoie l'espace supplémentaire.
awk '{$2="";sub(" "," ")}1' file
Une autre façon consiste à utiliser sed pour remplacer les premiers chiffres et la correspondance d'espace:
sed 's|[0-9]\+\s\+||' file