La plupart des solutions avec awk laissent un espace. Les options ici évitent ce problème.
Option 1
Une solution de découpe simple (ne fonctionne qu'avec des délimiteurs simples):
command | cut -d' ' -f3-
Option 2
Forcer un re-calc awk supprime parfois l'espace de tête (OFS) ajouté en supprimant les premiers champs (fonctionne avec certaines versions d'awk):
command | awk '{ $1=$2="";$0=$0;} NF=NF'
Option 3
L'impression de chaque champ formaté avec printf
donnera plus de contrôle:
$ in=' 1 2 3 4 5 6 7 8 '
$ echo "$in"|awk -v n=2 '{ for(i=n+1;i<=NF;i++) printf("%s%s",$i,i==NF?RS:OFS);}'
3 4 5 6 7 8
Cependant, toutes les réponses précédentes changent tous les FS répétés entre les champs en OFS. Construisons quelques options qui ne le font pas.
Option 4 (recommandée)
Une boucle avec sub pour supprimer les champs et délimiteurs à l'avant.
Et en utilisant la valeur de FS au lieu de l'espace (qui pourrait être modifié).
Est -ce plus facile à transporter et ne déclenche pas un changement de FS à BSF:
NOTE: Le ^[FS]*
est d'accepter une entrée par des espaces.
$ in=' 1 2 3 4 5 6 7 8 '
$ echo "$in" | awk '{ n=2; a="^["FS"]*[^"FS"]+["FS"]+";
for(i=1;i<=n;i++) sub( a , "" , $0 ) } 1 '
3 4 5 6 7 8
Option 5
Il est tout à fait possible de créer une solution qui n'ajoute pas d'espaces supplémentaires (de début ou de fin) et de conserver les espaces existants en utilisant la fonction gensub
de GNU awk, comme ceci:
$ echo ' 1 2 3 4 5 6 7 8 ' |
awk -v n=2 'BEGIN{ a="^["FS"]*"; b="([^"FS"]+["FS"]+)"; c="{"n"}"; }
{ print(gensub(a""b""c,"",1)); }'
3 4 5 6 7 8
Il peut également être utilisé pour échanger un groupe de champs en fonction d'un nombre n
:
$ echo ' 1 2 3 4 5 6 7 8 ' |
awk -v n=2 'BEGIN{ a="^["FS"]*"; b="([^"FS"]+["FS"]+)"; c="{"n"}"; }
{
d=gensub(a""b""c,"",1);
e=gensub("^(.*)"d,"\\1",1,$0);
print("|"d"|","!"e"!");
}'
|3 4 5 6 7 8 | ! 1 2 !
Bien sûr, 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é.
REMARQUE: [FS]*
est utilisé pour autoriser les espaces de tête dans la ligne d'entrée.
grep | awk
awk '/!/ { print $2 }'