Ich habe folgende Datei:
id name age
1 ed 50
2 joe 70
Ich möchte nur die Spalten id
und drucken age
. Im Moment benutze ich nur awk
:
cat file.tsv | awk '{ print $1, $3 }'
Dies setzt jedoch voraus, dass die Spaltennummern bekannt sind. Gibt es eine Möglichkeit, wie ich den Namen der Spalte (in der ersten Zeile angegeben) anstelle der Spaltennummer verwenden kann?
cat
ist nicht nötig, übrigens. Sie könntenawk '{ print $1, $3 }' file.tsv
id
statt$1
undage
statt sagen$3
Antworten:
Vielleicht so etwas:
Wenn Sie die Spalten angeben möchten, die in der Befehlszeile gedruckt werden sollen, können Sie Folgendes tun:
(Beachten Sie den
-v
Schalter, um die imBEGIN
Block definierte Variable zu erhalten .)quelle
awk -f t.awk col1 col2 ... coln input
wäre ideal;awk -f t.awk cols=col1,col2,...,coln input
würde auch funktionierenfor (i in out)
weist keine inhärente Reihenfolge auf.gawk
bietet sichPROCINFO["sorted_in"]
als Lösung an, über den Index mit a zu iterierenfor( ; ; )
ist wohl besser.Einfach eine Perl-Lösung in das Los werfen:
quelle
csvkit
Konvertieren Sie die Eingabedaten in ein CSV-Format und verwenden Sie ein CSV-Tool wie
csvcut
das folgendecsvkit
:Installieren Sie csvkit:
Mit
tr
der Squeeze-Option können-s
Sie die Datei in eine gültige CSV-Datei konvertieren und Folgendes anwendencsvcut
:Wenn Sie zum alten Datenformat zurückkehren möchten, können Sie verwenden
tr ',' ' ' | column -t
Anmerkungen
csvkit unterstützt auch verschiedene Trennzeichen ( shared option
-d
oder--delimiter
), gibt aber eine csv-Datei zurück:Wenn die Datei nur Leerzeichen zum Trennen von Spalten verwendet (überhaupt keine Tabulatoren), funktioniert Folgendes
Wenn die Datei eine Registerkarte zum Trennen von Spalten verwendet, funktioniert Folgendes und
csvformat
kann verwendet werden, um die TSV-Datei zurückzugewinnen:Soweit ich geprüft habe, ist nur ein Tab erlaubt.
csvlook
kann die Tabelle in einem Abzeichentabellenformat formatierenUUOC (Useless Use Of Cat) : Ich mag es so, den Befehl zu konstruieren.
quelle
tr
. TSV-Dateien werden direkt unterstützt, ohne dass sie in CSV konvertiert werden müssen. Die Option-t
(aka--tabs
) gibtcvscut
an, dass Tabulatoren als Feldtrennzeichen verwendet werden sollen. Und-d
oder ein--delimiter
beliebiges Zeichen als Trennzeichen verwenden.-d
und-t
-Optionen teilweise gebrochen sind. Sie arbeiten, um das Eingabe-Begrenzungszeichen anzugeben, aber das Ausgabe-Begrenzungszeichen ist fest codiert, um immer ein Komma zu sein. IMO ist defekt - es sollte entweder das gleiche wie das Eingabe-Trennzeichen sein oder eine andere Option haben, mit der der Benutzer das Ausgabe-Trennzeichen festlegen kann, wie z. B.awk
FS- und OFS-Variablen von.Wenn Sie diese Felder nur mit ihren Namen anstelle von Zahlen bezeichnen möchten , können Sie Folgendes verwendenread
:BEARBEITEN
Ich habe deine Bedeutung endlich gesehen! Hier ist eine Bash-Funktion, die nur die Spalten ausgibt, die Sie in der Befehlszeile angegeben haben (nach Namen ).
So können Sie es mit der präsentierten Datei verwenden:
(Die Funktion liest
stdin
.< file.tsv printColumns ...
Ist äquivalent zuprintColumns ... < file.tsv
undcat file.tsv | printColumns ...
)Hinweis: Achten Sie auf die Namen der gewünschten Spalten! In dieser Version gibt es keine Plausibilitätsprüfung, so dass schlimme Dinge passieren können, wenn eines der Argumente so etwas wie ist
"anything; rm /my/precious/file"
quelle
id
,name
undage
, nicht die Tatsache ändern , dass die Reihenfolge hartcodiert ist in Ihrerread
Linie.time { command(s); }
).time cat temp.txt | ./col1 CHR POS > /dev/null 99.144u 38.966s 2:19.27 99.1% 0+0k 0+0io 0pf+0w time awk -f col2 c1=CHR c2=POS temp.txt > /dev/null 0.294u 0.127s 0:00.50 82.0% 0+0k 0+0io 0pf+0w
Für was es wert ist. Dies kann eine beliebige Anzahl von Spalten in der Quelle und eine beliebige Anzahl von zu druckenden Spalten in der von Ihnen gewählten Ausgabereihenfolge verarbeiten. arrangieren Sie einfach die Argumente neu ...
z.B. Anruf:
script-name id age
Ausgabe
quelle
Wenn die Datei, die Sie lesen, niemals vom Benutzer generiert werden könnte, könnten Sie den eingebauten Lesezugriff missbrauchen:
Die gesamte erste Zeile der Eingabedatei wird in die Argumentliste eingefügt, sodass
read
alle Feldnamen aus der Kopfzeile als Variablennamen übergeben werden. Dem ersten wird dieseq 100
erzeugende 1 zugewiesen , dem zweiten die 2, dem dritten die 3 und so weiter. Überschüssigeseq
Leistung wird von der Dummy-Variablen aufgenommenextra
. Wenn Sie die Anzahl der Eingabespalten im Voraus kennen, können Sie die 100 ändern, um sie abzugleichen und loszuwerdenextra
.Das
awk
Skript ist eine Zeichenfolge in doppelten Anführungszeichen, mit der die durch definierten Shell-Variablenread
als Feldnummern in das Skript eingesetztawk
werden können.quelle
Normalerweise ist es einfacher, nur den Dateikopf zu betrachten, die Nummer der benötigten Spalte zu zählen ( c ) und dann Unix zu verwenden
cut
:Aber wenn es viele Spalten oder viele Dateien gibt, benutze ich den folgenden hässlichen Trick:
Getestet unter OSX ist das durch
file.csv
Kommas getrennt.quelle
Hier ist eine schnelle Möglichkeit zum Auswählen einer einzelnen Spalte.
Angenommen, wir möchten die Spalte "foo":
Nehmen Sie im Allgemeinen die Kopfzeile, teilen Sie sie in mehrere Zeilen mit einem Spaltennamen pro Zeile auf, nummerieren Sie die Zeilen, wählen Sie die Zeile mit dem gewünschten Namen aus und rufen Sie die zugehörige Zeilennummer ab. Verwenden Sie dann diese Zeilennummer als Spaltennummer für den Befehl cut.
quelle
Auf der Suche nach einer ähnlichen Lösung (ich benötige die Spalte mit dem Namen id, die eine unterschiedliche Spaltennummer haben könnte), bin ich auf diese gestoßen:
quelle
Zu diesem Zweck habe ich ein Python-Skript geschrieben, das im Grunde so funktioniert:
Ich habe es
hgrep
für header grep genannt , es kann so verwendet werden:Das gesamte Skript ist etwas länger, da es
argparse
zum Parsen von Befehlszeilenargumenten verwendet wird und der Code wie folgt lautet:quelle
awk
ist für alle Jahrgänge inhärent integer-indexiert, so wie es istcut
.Im Folgenden sind einige Tools aufgeführt, die für den Umgang mit namensindizierten Daten entwickelt wurden (die meisten verarbeiten nur CSV und TSV, die sehr beliebte Dateiformate sind):
quelle
Probieren Sie dieses kleine Hilfsprogramm awk aus, um bestimmte Header auszuschneiden - https://github.com/rohitprajapati/toyeca-cutter
Anwendungsbeispiel -
quelle