Wie schneide ich die ersten n und letzten n Spalten?

72

Wie kann ich die ersten n und die letzten n Spalten aus einer durch Tabulatoren getrennten Datei abschneiden ?

Ich habe versucht, die erste n Spalte zu schneiden . Aber ich habe keine Ahnung, erste und letzte n Spalte zu kombinieren

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

Antworten:

114

Der Schnitt kann mehrere Bereiche umfassen -f:

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

Kauppi
quelle
11
Es funktioniert viel besser mit einem Trennzeichen ....... cut -d '' -f -2 <<< 'Dies ist ein Test'
Yogamurthy
1
Das Standardtrennzeichen ist tab, daher ist @ Yogamurthys Kommentar der richtige Weg.
Noumenon
2
Dies beantwortet nicht den Teil "letzte n Spalten" der Frage.
LoMaPh
3

Sie können mit folgenden
Elementen schneiden : -d: Trennzeichen, -f für Felder
\ t, die für durch Tabulatoren getrennte Felder verwendet werden

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

Der erste Teil Ihrer Frage ist einfach. Wie bereits erwähnt, akzeptiert cut das Weglassen des Start- oder Endindex eines Spaltenbereichs und interpretiert dies als "vom Anfang bis zur Spalte n (einschließlich)" oder "von der Spalte n (einschließlich) bis zum Ende". beziehungsweise:

$ 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 das Kombinieren von Bereichen. 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

Der zweite Teil Ihrer Frage kann jedoch 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 gesamten Zeile)" meinen (dh weil Sie nicht unbedingt wissen, wie viele Spalten Sie im Voraus finden werden), ist dies leider nicht der Fall möglich verwenden zu erreichen cutallein. Um cutdie letzten n Spalten in jeder Zeile effektiv herausziehen zu können , muss die Gesamtzahl der in jeder Zeile vorhandenen Spalten im Voraus bekannt sein und jede Zeile muss in der Anzahl der darin enthaltenen Spalten konsistent sein.

Wenn Sie nicht wissen, wie viele „Spalten“ in jeder Zeile vorhanden sein können (z. B. weil Sie mit Eingaben arbeiten, die nicht streng tabellarisch sind), müssen Sie awkstattdessen so etwas wie verwenden. Um beispielsweise awkdie letzten 2 "Spalten" (awk nennt sie Felder, deren Anzahl pro Zeile variieren kann) aus jeder Eingabezeile herauszuziehen :

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

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

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

Leider bleiben damit die Feldtrennzeichen so

aaa bbb ccc

wird

[space]bbb[space]

Verwenden Sie dazu Kurumis Antwort, die keine zusätzlichen Leerzeichen lä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

Anschließend können Sie die Anzahl der zu überspringenden Felder am Anfang oder Ende ändern, indem Sie die Variablenzuweisungen am Anfang des Befehls ändern.

Dennis Williamson
quelle
Ich versuche, die Ausgabe von git branch-v zu schneiden, einige Zeilen haben ein zusätzliches *, also muss ich SPALTEN schneiden, wie OP gefragt, nicht Felder, awk funktioniert nur, wenn Sie Felder schneiden wollen, andere Frage ...
Cobusve
0

Sie können Bash dafür verwenden:

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

Sie können awk verwenden, um beispielsweise die 1., 2. und letzten 3 Spalten abzuschneiden

awk '{for(i=3;i<=NF-3;i++} print $i}' file

wenn Sie eine Programmiersprache wie Ruby (1.9+) haben

$ ruby -F"\t" -ane 'print $F[2..-3].join("\t")' file
kurumi
quelle
Ihre awk-Syntax scheint ausgeschaltet zu sein
Marki
-1

Versuche Folgendes:

echo a#b#c | awk -F"#" '{$1 = ""; $NF = ""; print}' OFS=""
user2009292
quelle
-1

Verwenden

cut -b COLUMN_N_BEGINS-COLUMN_N_UNTIL INPUT.TXT > OUTPUT.TXT

-f funktioniert nicht, wenn die Textdatei "Tabulatoren" enthält.

Yu Tao
quelle
Dies beantwortet die Frage nicht. How can I cut off the first n and the last n columns from a **tab** delimited file?Die Frage bezieht sich auf TAB- Spalten und reicht von und bis zum Ende. Ihre Antwort handelt von einem kontinuierlichen
Bytebereich
Leider habe ich nur den Titel gesehen, aber nicht den Inhalt. Weiß jemand, wie ich meine Antworten löschen kann?
Yu Tao