Die Optionen 1 bis 3 haben Probleme mit mehreren Leerzeichen (sind jedoch einfach). Aus diesem Grund sollten die Optionen 4 und 5 entwickelt werden, mit denen mehrere Leerzeichen problemlos verarbeitet werden können. Wenn die Optionen 4 oder 5 mit n=0
beiden verwendet werden, bleiben natürlich alle führenden Leerzeichen erhalten, da n=0
keine Aufteilung erfolgt.
Option 1
Eine einfache Schnittlösung (funktioniert mit einzelnen Trennzeichen):
$ echo '1 2 3 4 5 6 7 8' | cut -d' ' -f4-
4 5 6 7 8
Option 2
Das Erzwingen einer awk-Neuberechnung löst manchmal das Problem (funktioniert mit einigen Versionen von awk) der hinzugefügten führenden Leerzeichen:
$ echo '1 2 3 4 5 6 7 8' | awk '{ $1=$2=$3="";$0=$0;} NF=NF'
4 5 6 7 8
Option 3
Durch Drucken jedes mit formatierten Felds erhalten Sie printf
mehr Kontrolle:
$ 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
Alle vorherigen Antworten ändern jedoch alle FS zwischen Feldern in OFS. Lassen Sie uns ein paar Lösungen dafür entwickeln.
Option 4
Eine Schleife mit Sub zum Entfernen von Feldern und Trennzeichen ist portabler und löst keine Änderung von FS zu OFS aus:
$ 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
HINWEIS: Mit "^ [" FS "] *" wird eine Eingabe mit führenden Leerzeichen akzeptiert.
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=3 '{ print gensub("["FS"]*([^"FS"]+["FS"]+){"n"}","",1); }'
4 5 6 7 8
Es kann auch verwendet werden, um eine Feldliste mit einer bestimmten Anzahl auszutauschen 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 !
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 1: ["FS"]*
wird verwendet, um führende Leerzeichen in der Eingabezeile zuzulassen.
cut -f3-
?