GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie schneide ich die ersten n und letzten n Spalten?

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-

Linux
  1. Wie verwendet man Awk, um nur Zeilen mit 5 Spalten zu drucken?

  2. Arbeiten mit Spalten – Awk und Sed?

  3. Gewusst wie:DRBD-Replikation und -Konfiguration

  4. Wie Sie Ihr erstes Qt-Programm in Debian 10 schreiben und ausführen

  5. Wie teilt man eine Datei und behält die erste Zeile in jedem der Teile bei?

Wie man in Vim / Vi ausschneidet, kopiert und einfügt

Wie man in Vim / Vi kopiert, ausschneidet und einfügt

So installieren und konfigurieren Sie SeedDMS

So löschen Sie leere Zeilen in Dateien mit Grep, Sed und Awk

So finden Sie die letzte Anmeldung unter Linux

So installieren und konfigurieren Sie Grafana