Cut kann in -f
mehrere Bereiche annehmen :
Spalten bis 4 und ab 7:
cut -f -4,7-
oder für die Felder 1,2,5,6 und ab 10:
cut -f 1,2,5,6,10-
usw.
Der erste Teil Ihrer Frage ist einfach. Wie bereits erwähnt, akzeptiert cut das Weglassen entweder des Anfangs- oder des Endindex eines Spaltenbereichs, wobei dies entweder als „vom Anfang bis zur Spalte n“ interpretiert wird (inklusive)“ oder „ab Spalte n (einschließlich) bis zum Ende“, bzw.:
$ printf 'this:is:a:test' | cut -d: -f-2
this:is
$ printf 'this:is:a:test' | cut -d: -f3-
a:test
Es unterstützt auch Kombinieren reicht. Wenn Sie möchten, z. B. die ersten 3 und die letzten 2 Spalten in einer Reihe von 7 Spalten:
$ printf 'foo:bar:baz:qux:quz:quux:quuz' | cut -d: -f-3,6-
foo:bar:baz:quux:quuz
Allerdings Der zweite Teil Ihrer Frage kann etwas kniffliger sein, je nachdem, welche Art von Eingabe Sie erwarten. Wenn durch „letzte n Spalten“ meinen Sie „letzte n Spalten (unabhängig von ihren Indizes in der Gesamtzeile)“ (d.h. weil Sie nicht unbedingt wissen, wie viele Spalten Sie im Voraus finden werden), dann ist dies leider nicht mit cut
möglich allein. Um cut
effektiv zu nutzen um „das letzte n herauszuziehen Spalten“ in jeder Zeile die Gesamtzahl der in jeder Zeile vorhandenen Spalten müssen vorher bekannt sein, und jede Zeile muss in der Anzahl der enthaltenen Spalten konsistent sein.
Wenn Sie dies nicht tun wissen, wie viele „Spalten“ in jeder Zeile vorhanden sein können (z. B. weil Sie mit Eingaben arbeiten, die nicht streng tabellarisch sind), dann müssen Sie so etwas wie awk
verwenden stattdessen. Zum Beispiel, um awk
zu verwenden um die letzten 2 „Spalten“ herauszuziehen (awk nennt sie Felder, deren Anzahl pro Zeile variieren kann) aus jeder Eingabezeile:
$ printf '/a\n/a/b\n/a/b/c\n/a/b/c/d\n' | awk -F/ '{print $(NF-1) FS $(NF)}'
/a
a/b
b/c
c/d
So verwenden Sie AWK, um das erste und letzte Feld abzuschneiden:
awk '{$1 = ""; $NF = ""; print}' inputfile
Leider bleiben damit die Feldtrenner, also
aaa bbb ccc
wird
[space]bbb[space]
Verwenden Sie dazu die Antwort von kurumi, die keine zusätzlichen Leerzeichen hinterlässt, sondern auf eine Weise, die Ihren Anforderungen entspricht:
awk '{delim = ""; for (i=2;i<=NF-1;i++) {printf delim "%s", $i; delim = OFS}; printf "\n"}' inputfile
Dies behebt auch einige Probleme in dieser Antwort.
Um das zu verallgemeinern:
awk -v skipstart=1 -v skipend=1 '{delim = ""; for (i=skipstart+1;i<=NF-skipend;i++) {printf delim "%s", $i; delim = OFS}; printf "\n"}' inputfile
Dann können Sie die Anzahl der zu überspringenden Felder am Anfang oder Ende ändern, indem Sie die Variablenzuweisungen am Anfang des Befehls ändern.
Sie können mit folgendem schneiden,
-d:Trennzeichen ,-f für Felder
\t wird für tabulatorgetrennte Felder verwendet
cut -d$'\t' -f 1-3,7-