GNU/Linux >> Linux Esercitazione >  >> Linux

Come tagliare le prime n e le ultime n colonne?

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-

Linux
  1. Come utilizzare Awk e le espressioni regolari per filtrare testo o stringhe nei file

  2. Come eliminare le prime / ultime "n" righe dall'output del comando in Shell?

  3. Come scrivere ed eseguire il tuo primo programma Qt in Debian 10

  4. Come stampare dalla terza colonna all'ultima colonna?

  5. Utilizzo di awk per stampare tutte le colonne dall'ennesima all'ultima

Come tagliare, copiare e incollare in Vim/Vi

Come copiare, tagliare e incollare in Vim/Vi

Come installare e configurare SeedDMS

Come eliminare le righe vuote nei file utilizzando Grep, Sed e Awk

Come trovare l'ultimo accesso su Linux

Come installare e configurare Grafana