Les options 1 à 3 ont des problèmes avec plusieurs espaces (mais sont simples). C'est la raison pour laquelle nous avons développé les options 4 et 5, qui traitent sans problème plusieurs espaces blancs. Bien sûr, si les options 4 ou 5 sont utilisées avec les n=0
deux, tout espace blanc de début sera conservé commen=0
signifie qu'il n'y a pas de division.
Option 1
Une solution de coupe simple (fonctionne avec des délimiteurs simples):
$ echo '1 2 3 4 5 6 7 8' | cut -d' ' -f4-
4 5 6 7 8
Option 2
Forcer un recalcul awk résout parfois le problème (fonctionne avec certaines versions de awk) des espaces de début ajoutés:
$ echo '1 2 3 4 5 6 7 8' | awk '{ $1=$2=$3="";$0=$0;} NF=NF'
4 5 6 7 8
Option 3
L'impression de chaque champ formaté avec printf
donnera plus de contrôle:
$ echo ' 1 2 3 4 5 6 7 8 ' |
awk -v n=3 '{ for (i=n+1; i<=NF; i++){printf("%s%s",$i,i==NF?RS:OFS);} }'
4 5 6 7 8
Cependant, toutes les réponses précédentes changent tous les FS entre les champs en OFS. Construisons quelques solutions à cela.
Option 4
Une boucle avec sous pour supprimer les champs et les délimiteurs est plus portable et ne déclenche pas de changement de FS en OFS:
$ echo ' 1 2 3 4 5 6 7 8 ' |
awk -v n=3 '{ for(i=1;i<=n;i++) { sub("^["FS"]*[^"FS"]+["FS"]+","",$0);} } 1 '
4 5 6 7 8
REMARQUE: Le "^ [" FS "] *" est d'accepter une entrée avec des espaces de début.
Option 5
Il est tout à fait possible de construire une solution qui n'ajoute pas d'espaces blancs supplémentaires de début ou de fin, et de conserver les espaces blancs existants en utilisant la fonction gensub
de GNU awk, comme ceci:
$ echo ' 1 2 3 4 5 6 7 8 ' |
awk -v n=3 '{ print gensub("["FS"]*([^"FS"]+["FS"]+){"n"}","",1); }'
4 5 6 7 8
Il peut également être utilisé pour échanger une liste de champs en fonction d'un nombre n
:
$ echo ' 1 2 3 4 5 6 7 8 ' |
awk -v n=3 '{ a=gensub("["FS"]*([^"FS"]+["FS"]+){"n"}","",1);
b=gensub("^(.*)("a")","\\1",1);
print "|"a"|","!"b"!";
}'
|4 5 6 7 8 | ! 1 2 3 !
Bien entendu, dans ce cas, l'OFS est utilisé pour séparer les deux parties de la ligne, et l'espace blanc de fin des champs est toujours imprimé.
Note1: ["FS"]*
est utilisé pour autoriser les espaces de début dans la ligne d'entrée.
cut -f3-
?