125 votes

Imprimer tout mais les trois premières colonnes

Trop lourd :

77voto

jiju Points 619
awk '{for(i=1;i<4;i++) $i="";print}' file

77voto

ghostdog74 Points 86060

utiliser le couper

ou si vous insistez pour 13 $ et awk est le dernier champ

d’autre

56voto

olibre Points 6069

Une solution qui n'est pas ajouter des espaces avant ni après:

awk '{for(i=4;i<NF;i++)printf "%s",$i OFS; if (NF) printf "%s",$NF; printf ORS}'

Démo:

$ echo '1 2 3 4 5 6 7' | 
  awk '{for(i=4;i<NF;i++) printf"%s",$i OFS;if(NF)printf"%s",$NF;printf ORS}' | 
  tr ' ' '-'
4-5-6-7

Une autre approche à l'aide de l'opérateur ternaire est Sudo_O's solution:

$ echo '1 2 3 4 5 6 7' |
  awk '{for(i=4;i<=NF;i++)printf "%s",$i (i==NF?ORS:OFS)}' | tr ' ' '-'
4-5-6-7

Et EdMorton donne une solution qui préserve l'origine des espaces entre les champs:

$ echo '1   2 3 4   5    6 7' |
awk '{sub(/([^ ]+ +){3}/,"")}1' | tr ' ' '-'
4---5----6-7

La solution donnée par la larsr dans les commentaires est presque correct:

$ echo '1 2 3 4 5 6 7' | 
  awk '{for (i=3;i<=NF;i++) $(i-2)=$i; NF=NF-2; print $0}' | tr  ' ' '-'
3-4-5-6-7

C'est le fixe et paramétrés version de larsr solution:

$ echo '1 2 3 4 5 6 7' | 
  awk '{for(i=n;i<=NF;i++)$(i-(n-1))=$i;NF=NF-(n-1);print $0}' n=4 | tr ' ' '-'
4-5-6-7

Toutes les autres réponses sont sympa, mais ajouter des espaces supplémentaires:

37voto

lhf Points 30556

Essaye ça:

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

26voto

Ed Morton Points 25374

La bonne façon de le faire est avec un RE intervalle, car il vous permet tout simplement de l'état combien de champs de sauter, et conserve inter-domaine d'espacement pour les autres champs.

par exemple, pour sauter les 3 premiers champs sans affecter l'espacement entre les champs restants étant donné le format de l'entrée nous semblent être de discuter de cette question est tout simplement:

$ echo '1   2 3 4   5    6' |
awk '{sub(/([^ ]+ +){3}/,"")}1'
4   5    6

Si vous souhaitez accueillir des espaces et non des espaces vides, mais avec la valeur par défaut de FS, alors c'est:

$ echo '  1   2 3 4   5    6' |
awk '{sub(/[[:space:]]*([^[:space:]]+[[:space:]]+){3}/,"")}1'
4   5    6

Si vous avez un FS qui est une RE vous ne pouvez pas nier dans un jeu de caractères, vous pouvez convertir en un seul char première (RS est idéal si un seul char depuis un RS NE peut pas apparaître à l'intérieur d'un champ, sinon, envisager de SUBSEP), puis appliquer la RE intervalle de remplacement, puis de les convertir à l'OFS. par exemple, si les chaînes de "."s séparés les champs:

$ echo '1...2.3.4...5....6' |
awk -F'[.]+' '{gsub(FS,RS);sub("([^"RS"]+["RS"]+){3}","");gsub(RS,OFS)}1'
4 5 6

Bien évidemment, si l'OFS est un seul char ET il ne peut pas apparaître dans le champs de saisie, vous pouvez réduire le à:

$ echo '1...2.3.4...5....6' |
awk -F'[.]+' '{gsub(FS,OFS); sub("([^"OFS"]+["OFS"]+){3}","")}1'
4 5 6

Ensuite, vous avez le même problème qu'avec l'ensemble de la boucle de solutions de réaffecter les domaines - de la FSs sont convertis à OFSs. Si c'est un problème, vous devez regarder dans GNU awks' patsplit() fonction.

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