442 votes

Utilisation d'awk pour imprimer toutes les colonnes de la nième à la dernière

Cette ligne fonctionnait jusqu'à ce que j'aie des espaces dans le deuxième champ.

svn status | grep '\!' | gawk '{print $2;}' > removedProjs

Existe-t-il un moyen de faire en sorte que l'awk imprime tout ce qui est en $2 ou plus ? (3, 4 jusqu'à ce que nous n'ayons plus de colonnes ?)

Je suppose que je dois ajouter que je fais cela dans un environnement Windows avec Cygwin.

17 votes

Soit dit en passant, le grep | awk est un anti-modèle -- vous voulez awk '/!/ { print $2 }'

5 votes

Le "cut" d'Unix est plus facile... svn status | grep '\!' | cut -d' ' -f2- > removedProjs

0 votes

Duplicata possible de imprimer le reste des champs en awk

675voto

zed_0xff Points 12379

Imprimer toutes les colonnes :

awk '{print $0}' somefile

Imprimez tout sauf la première colonne :

awk '{$1=""; print $0}' somefile

Imprimez tout sauf les deux premières colonnes :

awk '{$1=$2=""; print $0}' somefile

0 votes

@zed très bien, assurez-vous simplement d'utiliser $1 pour tout ce dont vous pourriez avoir besoin, avant de le changer.

121 votes

Gotcha : laisse un espace de tête qui traîne :(

1 votes

cat somefile peut toujours être remplacé par < somefile à la fin de awk commande

122voto

Joshua Goldberg Points 1013

Il y a une question en double avec une réponse plus simple en utilisant la coupe :

 svn status |  grep '\!' | cut -d\  -f2-

-d spécifie le délimiteur (espace) , -f spécifie la liste des colonnes (tous commençant par le 2ème)

0 votes

Vous pouvez également utiliser "-b" pour spécifier la position (à partir du Nième caractère).

0 votes

À titre de remarque, bien que cette fonction effectue la même tâche que la fonction awk il y a des problèmes de mise en mémoire tampon des lignes avec cut qui awk n'a pas : stackoverflow.com/questions/14360640/

32 votes

Sympathique et simple, mais avec une mise en garde : awk traite les caractères d'espacement adjacents multiples comme une simple séparateur, tandis que cut ne le fait pas ; également - bien que ce ne soit pas un problème dans le cas présent - cut n'accepte qu'un seul caractère littéral. comme délimiteur, alors que awk permet une regex.

114voto

VeeArr Points 3504

Vous pourriez utiliser une boucle for pour passer en revue les champs d'impression de $2 à $NF (variable intégrée qui représente le nombre de champs sur la ligne).

Modifier : Puisque "print" ajoute une nouvelle ligne, vous voudrez mettre les résultats en mémoire tampon :

awk '{out=""; for(i=2;i<=NF;i++){out=out" "$i}; print out}'

Vous pouvez également utiliser printf :

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

0 votes

J'ai essayé, mais je pense qu'il me manque quelque chose voici ce que j'ai fait svn status | grep '³ ! | gawk '{for (i=1 ; i<=$NF ; i++)print $i " ";}' > removedProjs

0 votes

Puisque print ajoute une nouvelle ligne, vous voudrez mettre les résultats en mémoire tampon. Voir mon édition.

0 votes

Quand je fais cela, j'obtiens un message qui dit ^ chaîne non terminée.

28voto

Wim Points 100
awk '{out=$2; for(i=3;i<=NF;i++){out=out" "$i}; print out}'

Ma réponse est basée sur celui de VeeArr mais j'ai remarqué qu'il y avait un espace blanc avant l'impression de la deuxième colonne (et du reste). Comme je n'ai qu'un seul point de réputation, je ne peux pas faire de commentaire, alors voici une nouvelle réponse :

commencer par "out" comme deuxième colonne, puis ajouter toutes les autres colonnes (si elles existent). Cela fonctionne bien tant qu'il y a une deuxième colonne.

2 votes

Excellent, vous avez également supprimé le $ devant la variable out, ce qui est également important.

16voto

koullislp Points 106

J'ai personnellement essayé toutes les réponses mentionnées ci-dessus, mais la plupart d'entre elles étaient un peu complexes ou ne convenaient tout simplement pas. De mon point de vue, la façon la plus simple de procéder est la suivante :

awk -F" " '{ for (i=4; i<=NF; i++) print $i }'
  1. Où -F" " définit le délimiteur à utiliser par awk. Dans mon cas, c'est l'espace blanc, qui est aussi le délimiteur par défaut pour l'awk. Cela signifie que -F" " peut être ignoré.

  2. Où NF définit le nombre total de champs/colonnes. Par conséquent, la boucle commencera à partir du quatrième champ jusqu'au dernier champ/colonne.

  3. Où $N récupère la valeur du Nième champ. Par conséquent, print $i imprimera le champ/colonne actuel en fonction du nombre de boucles.

5 votes

Problème, cela imprime chaque champ sur une ligne différente.

0 votes

Rien ne vous empêche d'ajouter ceci à la fin :-) ` | tr ' \n ' ' ' `

4 votes

Un peu tard mais awk '{ for (i = 5 ; i <= NF ; i++) { printf "%s ", $i } } }'

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X