GNU/Linux >> Znalost Linux >  >> Linux

Jak vyříznout prvních n a posledních n sloupců?

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-

Linux
  1. Jak odstranit první/poslední „n“ řádky z výstupu příkazu v prostředí Shell?

  2. Vytisknout obsah souboru bez prvního a posledního řádku?

  3. Řez / Grep A Df -h?

  1. Jak používat Awk a regulární výrazy k filtrování textu nebo řetězců v souborech

  2. Jak používat Awk k tisku pouze řádků obsahujících 5 sloupců?

  3. Práce se sloupci – Awk a Sed?

  1. Jak na to:Replikace a konfigurace DRBD

  2. Jak napsat a spustit svůj první Qt program v Debianu 10

  3. Jak rozdělit soubor a zachovat první řádek v každém z kusů?