Vyjmout může v -f
trvat několik rozsahů :
Sloupce do 4 a od 7:
cut -f -4,7-
nebo pro pole 1,2,5,6 a od 10 výše:
cut -f 1,2,5,6,10-
atd
První část vaší otázky je snadná. Jak již bylo zmíněno, cut akceptuje vynechání počátečního nebo koncového indexu rozsahu sloupců, což znamená buď „od začátku do sloupce n (včetně)“ nebo „ze sloupce n (včetně) do konce,“ respektive:
$ printf 'this:is:a:test' | cut -d: -f-2
this:is
$ printf 'this:is:a:test' | cut -d: -f3-
a:test
Podporuje také kombinování rozsahy. Pokud chcete, např. první 3 a poslední 2 sloupce v řadě po 7 sloupcích:
$ printf 'foo:bar:baz:qux:quz:quux:quuz' | cut -d: -f-3,6-
foo:bar:baz:quux:quuz
Nicméně druhá část vaší otázky může být trochu složitější v závislosti na tom, jaký druh vstupu očekáváte. Pokud do „posledního n sloupce“ máte na mysli „poslední n sloupců (bez ohledu na jejich indexy v celkovém řádku)“ (tj. protože předem nezbytně nevíte, kolik sloupců najdete), tak to bohužel není možné provést pomocí cut
sám. Aby bylo možné efektivně používat cut
vytáhněte „poslední n sloupce“ v každém řádku celkový počet sloupců přítomných v každém řádku musí být předem znám a každý řádek musí být konzistentní v počtu sloupců, které obsahuje.
Pokud ne vědět, kolik „sloupců“ může být přítomno v každém řádku (např. protože pracujete se vstupem, který není striktně tabulkový), pak budete muset použít něco jako awk
namísto. Chcete-li například použít awk
vytáhněte poslední 2 „sloupce“ (awk je nazývá pole, jejich počet se může lišit na řádku) z každého řádku vstupu:
$ 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
Chcete-li použít AWK k odříznutí prvního a posledního pole:
awk '{$1 = ""; $NF = ""; print}' inputfile
Bohužel tím zůstávají oddělovače polí, takže
aaa bbb ccc
se stává
[space]bbb[space]
Chcete-li to provést pomocí odpovědi kurumi, která nezanechá další mezery, ale způsobem, který je specifický pro vaše požadavky:
awk '{delim = ""; for (i=2;i<=NF-1;i++) {printf delim "%s", $i; delim = OFS}; printf "\n"}' inputfile
To také opravuje několik problémů v této odpovědi.
Abych to zobecnil:
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
Poté můžete změnit počet polí, která se mají přeskočit na začátku nebo na konci, změnou přiřazení proměnných na začátku příkazu.
Můžete řezat pomocí následujících,
-d:oddělovač ,-f pro pole
\t používá se pro pole oddělená tabulátory
cut -d$'\t' -f 1-3,7-