web-dev-qa-db-de.com

Wie schneidet man die ersten n und die letzten n Spalten ab?

Wie kann ich die erste n - und die letzte n -Spalte von einer tabulatorgetrennten Datei abschneiden?

Ich habe versucht, die erste n -Spalte zu schneiden. Ich habe jedoch keine Idee, die erste und letzte n-Spalte zu kombinieren

cut -f 1-10 -d "<CTR>v <TAB>" filename
63
haluk

Der Schnitt kann in -f mehrere Bereiche annehmen:

Spalten bis zu 4 und ab 7: 

cut -f -4,7-

oder für Felder 1,2,5,6 und ab 10:

cut -f 1,2,5,6,10-

usw

92
kauppi

So verwenden Sie AWK, um das erste und das letzte Feld abzuschneiden:

awk '{$1 = ""; $NF = ""; print}' inputfile

Das lässt leider die Feldtrennzeichen so

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

Sie können dann die Anzahl der Felder ändern, die zu Beginn oder am Ende übersprungen werden sollen, indem Sie die Variablenzuweisungen am Anfang des Befehls ändern.

1

Der erste Teil Ihrer Frage ist einfach. Wie bereits erwähnt, akzeptiert cut das Auslassen des Start- oder Endindex eines Spaltenbereichs. Dies bedeutet, dass es entweder "vom Anfang bis zur Spalte n (einschließlich)" oder "aus der Spalte n bedeutet. (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 werden auch Kombinationsbereiche unterstützt. Wenn Sie z. B. die ersten 3 und die letzten 2 Spalten in einer Reihe von 7 Spalten möchten,

$ printf 'foo:bar:baz:qux:quz:quux:quuz' | cut -d: -f-3,6-
foo:bar:baz:quux:quuz

Allerdings kann der zweite Teil Ihrer Frage etwas kniffliger sein, je nachdem, welche Art von Eingabe Sie erwarten. Wenn Sie mit „letzte n -Spalten“ „letzte n -Spalten (unabhängig von ihren Indizes in der Gesamtzeile)“ meinen (dh weil Sie nicht unbedingt wissen, wie viele Spalten Sie finden werden) dann kann dies leider nicht allein mit cut durchgeführt werden. Um mit cut effektiv "die letzten n -Spalten" in jeder Zeile herauszuziehen, muss die Gesamtzahl der in jeder Zeile vorhandenen Spalten vorher bekannt sein.undJede Zeile muss in der Anzahl der enthaltenen Spalten konsistent sein.

Wenn Sie not nicht wissen, wie viele "Spalten" in jeder Zeile vorhanden sein können (beispielsweise weil Sie mit Eingaben arbeiten, die nicht streng tabellarisch sind), müssen Sie stattdessen etwas wie awk verwenden. Zum Beispiel: Verwenden Sie awk, um die letzten 2 "Spalten" (awk nennt sie Felder, deren Anzahl pro Zeile variieren kann) aus jeder Zeile der Eingabe:

$ 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
0
Mark G.

Sie können Bash dafür verwenden:

while read -a cols; do echo ${cols[@]:0:1} ${cols[@]:1,-1}; done < file.txt
0
kenorb

Sie können mit folgendem schneiden,
- d: Trennzeichen, -f für Felder
\t wird für durch Tabulatoren getrennte Felder verwendet

cut -d$'\t' -f 1-3,7-
0
Saurabh