Die meisten Lösungen mit awk lassen ein Leerzeichen. Die Optionen hier vermeiden dieses Problem.
Option 1
Eine einfache Schnittlösung (funktioniert nur mit einzelnen Trennzeichen):
command | cut -d' ' -f3-
Option 2
Wenn Sie eine awk-Neuberechnung erzwingen, entfernen Sie manchmal das hinzugefügte führende Leerzeichen (OFS), indem Sie die ersten Felder entfernen (funktioniert mit einigen Versionen von awk):
command | awk '{ $1=$2="";$0=$0;} NF=NF'
Option 3
Durch Drucken jedes mit formatierten Felds erhalten Sie printf
mehr Kontrolle:
$ 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 erstellen, die dies nicht tun.
Option 4 (empfohlen)
Eine Schleife mit Sub, um Felder und Trennzeichen an der Vorderseite zu entfernen.
Und mit dem Wert von FS anstelle von Leerzeichen (das geändert werden könnte).
Ist mehr tragbar und löst keine Änderung des FS zu OFS:
HINWEIS: Das ^[FS]*
ist 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 erstellen, die keine zusätzlichen (führenden oder nachfolgenden) Leerzeichen hinzufügt und vorhandene Leerzeichen mithilfe der Funktion gensub
von GNU awk wie folgt beibehält:
$ 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
Es kann auch verwendet werden, um eine Gruppe von Feldern bei einer bestimmten Anzahl auszutauschen 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 !
In diesem Fall wird das OFS natürlich verwendet, um beide Teile der Zeile zu trennen, und der nachfolgende Leerraum der Felder wird weiterhin gedruckt.
HINWEIS: [FS]*
wird verwendet, um führende Leerzeichen in der Eingabezeile zuzulassen.
grep | awk
ein Antimuster - Sie wollenawk '/!/ { print $2 }'