Ich muss die Spalten eines sehr großen Datensatzes sortieren (1000 Zeilen und 700000 Spalten). Zum Beispiel sind meine Spalten wie folgt zufällig angeordnet: col1 col4 col3 col2, und das muss ich sortieren.
Ich habe einige Befehle ausprobiert, aber keinen Erfolg.
Beispiel:
ID M2 M5 M8 M1 M3 M9 .....M7000000
Animal1 1 0 2 1 0 2 .....1
Animal2 0 1 2 0 1 1 .....0
Animal3 2 1 0 1 2 1 .....0
.
.
.
.
Animaln
In diesem Beispiel bedeuten Punkte, dass ich viele Spalten und Zeilen habe. Wieder muss ich die Spalten sortieren, um wie folgt zu sein:
ID M1 M2 M3 M4 M5 M6 .....M7000000
Animal1 1 0 2 1 0 2 .....1
Animal2 0 1 2 0 1 1 .....0
Animal3 2 1 0 1 2 1 .....0
.
.
.
.
Animaln
Vielen Dank
text-processing
awk
LLVerardo
quelle
quelle
Antworten:
Mit GNU
datamash
und GNUsort
:Dies funktioniert gut für "relativ kleine" Daten. Es kann mit Ihrer Datei funktionieren oder nicht.
Bearbeiten: Die folgenden Lösungen ohne Transpositionen sollten weniger ressourcenintensiv sein.
quelle
datamash
zB seinrs -T < file_in.csv | sort | rs -T -C' '
(rs
sollte als Paket auf Debian-basierten Systemen verfügbar sein)rs
("reshape a data array") ist in den Basissystemen einiger BSDs verfügbar.M
die am Anfang vorkommtSchwartzian maneuver
. Dadurch werden die Indizes neu angeordnet, sodass die Spalten in numerisch sortierter Reihenfolge (M1, M2, M3, ...) ausgegeben werden.@I
um die@F
Elemente neu anzuordnen .-p
Option zu Perl aktiviert den Autoprint von$_
Inhalten,-l
soll das hinzufügennewline
.quelle
Verwendung des Perl-Moduls Sort :: Natürlich
Eingabedaten
Ausgabe
quelle
Wenn Sie das
rs
Dienstprogramm installiert haben, können Sie dies tun:Oder alles in einer Zeile:
rs
transponiert die Eingabedaten (mit durch Leerzeichen getrennten Feldern)sed
Liest die erste Zeile, gibt sie aus, beendet sie dann und lässt den Rest der Pipers
unberührt.stdbuf
ist erforderlich, um sicherzustellen, dasssed
nur bis zur ersten Zeile und nicht weiter gelesen wird, indem die Eingabepufferung ausgeschaltet wirdsort
s die restlichen Zeilenrs
transponiert den resultierenden Strom zurück in sein ursprüngliches Format.rs
ist standardmäßig unter MacOS installiert. Auf Linux-Systemen müssen Sie es möglicherweise installieren - zEinschränkung:
stdbuf
undsort
s-V
Option sind GNU-spezifisch, funktionieren also nicht unter unverändertem MacOS.quelle
Wenn Sie GNU haben
awk
, können Sie dies versuchen:quelle
In Python:
quelle
Ich weiß nicht, ob Sie das für eine gute Antwort hielten, aber ...
Warum verwenden Sie keine Datenbank, um dieses Problem zu lösen? Sie können Ihr Dataset als temporäre Tabelle importieren und dann Folgendes ausführen: a
Sie können bei Bedarf auch andere Filter oder Transformationen verwenden. Anschließend können Sie Ihre Ausgabe nach Bedarf neu formatieren.
Alle diese Aufgaben können als Bash-Skript programmiert und die Ausgaben mithilfe von Pipes verkettet werden.
Manchmal wurde der Befehl "pv" verwendet, um den Fortschritt der Ausgabe zwischen den Befehlen zu sehen.
Um den Datensatz zu importieren, können Sie eine ETL mit Pentaho Data Integration programmieren.
quelle
Vielleicht könnte dir das auch helfen.
Ex:
quelle