Die meisten Lösungen mit awk hinterlassen ein Leerzeichen. Die Optionen hier vermeiden dieses Problem.
Option 1
Eine einfache Lösung zum Ausschneiden (funktioniert nur mit einzelnen Begrenzungszeichen):
command | cut -d' ' -f3-
Option 2
Das Erzwingen einer awk-Neuberechnung entfernt manchmal das hinzugefügte führende Leerzeichen (OFS), das beim Entfernen der ersten Felder übrig bleibt (funktioniert mit einigen Versionen von awk):
command | awk '{ $1=$2="";$0=$0;} NF=NF'
Option 3
Drucken jedes Feldes, das mit printf
wird mehr Kontrolle ermöglichen:
$ 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
Alle vorherigen Antworten ändern jedoch alle wiederholten FS zwischen Feldern in OFS. Lassen Sie uns ein paar Optionen entwickeln, die das nicht tun.
Option 4 (empfohlen)
Eine Schleife mit Sub, um Felder und Begrenzungszeichen am Anfang zu entfernen.
Und die Verwendung des Wertes von FS anstelle des Leerzeichens (das geändert werden könnte).
Ist besser übertragbar und führt nicht zu einem Wechsel von FS zu OFS: HINWEIS: Die ^[FS]*
ist es, eine Eingabe mit führenden Leerzeichen zu akzeptieren.
$ 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
Es ist durchaus möglich, eine Lösung zu entwickeln, die keine zusätzlichen (führenden oder nachgestellten) Leerzeichen hinzufügt und vorhandene Leerzeichen beibehält, indem man die Funktion gensub
von GNU awk, als dies:
$ 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
Sie kann auch verwendet werden, um eine Gruppe von Feldern mit einer bestimmten Anzahl zu vertauschen 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 !
Natürlich wird in diesem Fall das OFS verwendet, um die beiden Teile der Zeile zu trennen, und der hintere Leerraum der Felder wird weiterhin gedruckt.
HINWEIS: [FS]*
wird verwendet, um führende Leerzeichen in der Eingabezeile zuzulassen.