Il taglio può richiedere diversi intervalli in -f
:
Colonne fino alla 4 e dalla 7 in poi:
cut -f -4,7-
oppure per i campi 1,2,5,6 e dal 10 in poi:
cut -f 1,2,5,6,10-
ecc
La prima parte della tua domanda è facile. Come già sottolineato, cut accetta l'omissione dell'indice iniziale o finale di un intervallo di colonne, interpretandolo nel senso di "dall'inizio alla colonna n (incluso)" o "dalla colonna n (incluso) fino alla fine", rispettivamente:
$ printf 'this:is:a:test' | cut -d: -f-2
this:is
$ printf 'this:is:a:test' | cut -d: -f3-
a:test
Supporta anche la combinazione gamme. Se vuoi, ad esempio, le prime 3 e le ultime 2 colonne in una riga di 7 colonne:
$ printf 'foo:bar:baz:qux:quz:quux:quuz' | cut -d: -f-3,6-
foo:bar:baz:quux:quuz
Tuttavia, la seconda parte della tua domanda può essere un po' più complicata a seconda del tipo di input che ti aspetti. Se con "ultimo n colonne" intendi "ultimo n colonne (indipendentemente dai loro indici nella riga complessiva)" (ovvero perché non sai necessariamente quante colonne troverai in anticipo), purtroppo non è possibile farlo utilizzando cut
solo. Per utilizzare efficacemente cut
per tirare fuori “l'ultima n colonne" in ogni riga, il numero totale di colonne presenti in ogni riga devono essere note in anticipo, e ogni riga deve essere coerente nel numero di colonne che contiene.
Se non sai quante "colonne" possono essere presenti in ogni riga (ad es. perché stai lavorando con input che non sono strettamente tabulari), allora dovrai usare qualcosa come awk
invece. Ad esempio, per usare awk
per estrarre le ultime 2 "colonne" (awk le chiama campi il cui numero può variare per riga) da ciascuna riga di input:
$ 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
Per utilizzare AWK per tagliare il primo e l'ultimo campo:
awk '{$1 = ""; $NF = ""; print}' inputfile
Sfortunatamente, rimangono i separatori di campo, quindi
aaa bbb ccc
diventa
[space]bbb[space]
Per farlo, usa la risposta di kurumi che non lascerà spazi extra, ma in un modo specifico per le tue esigenze:
awk '{delim = ""; for (i=2;i<=NF-1;i++) {printf delim "%s", $i; delim = OFS}; printf "\n"}' inputfile
Questo risolve anche un paio di problemi in quella risposta.
Per generalizzare:
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
Quindi puoi modificare il numero di campi da saltare all'inizio o alla fine modificando le assegnazioni delle variabili all'inizio del comando.
Puoi tagliare usando quanto segue,
-d:delimitatore ,-f per i campi
\t utilizzato per i campi separati da tabulazioni
cut -d$'\t' -f 1-3,7-