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
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-
quelle
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
cut
allein. Umcut
die 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
awk
stattdessen so etwas wie verwenden. Um beispielsweiseawk
die 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
quelle
So verwenden Sie AWK, um das erste und das letzte Feld abzuschneiden:
awk '{$1 = ""; $NF = ""; print}' inputfile
Leider bleiben damit die Feldtrennzeichen so
wird
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.
quelle
Sie können Bash dafür verwenden:
while read -a cols; do echo ${cols[@]:0:1} ${cols[@]:1,-1}; done < file.txt
quelle
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
quelle
Versuche Folgendes:
echo a#b#c | awk -F"#" '{$1 = ""; $NF = ""; print}' OFS=""
quelle
Verwenden
-f
funktioniert nicht, wenn die Textdatei "Tabulatoren" enthält.quelle
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