Trop lourd :
Réponses
Trop de publicités?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:
-
Exemple de réponse ajoutant des espaces:
$ echo '1 2 3 4 5 6 7' | awk '{$1=$2=$3=""}1' | tr ' ' '-' ---4-5-6-7
-
Exemple de réponse de l'ajout de l'espace extra fin
$ echo '1 2 3 4 5 6 7' | awk '{for(i=4;i<=13;i++)printf "%s ",$i;printf "\n"}' file | tr ' ' '-' 4-5-6-7-
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.