J'ai besoin de trier les colonnes d'un très grand ensemble de données (1000 lignes et 700000 colonnes). Par exemple, mes colonnes sont disposées au hasard comme: col1 col4 col3 col2, et je dois trier cela.
J'ai essayé quelques commandes, mais sans succès.
exemple:
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
Dans cet exemple, les points signifient que j'ai beaucoup de colonnes et de lignes. Encore une fois, je dois trier les colonnes comme suit:
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
Je vous remercie
text-processing
awk
LLVerardo
la source
la source
Réponses:
Avec GNU
datamash
et GNUsort
:Cela fonctionne très bien pour les données "raisonnablement petites". Il peut ou non fonctionner avec votre fichier.
Edit: Les solutions ci-dessous sans transpositions devraient être moins gourmandes en ressources.
la source
datamash
exemplers -T < file_in.csv | sort | rs -T -C' '
(rs
devrait être disponible sous forme de package sur les systèmes basés sur Debian)rs
("remodeler un tableau de données") est disponible dans les systèmes de base de certains BSD.M
apparaissant au début, en utilisant le bien connuSchwartzian maneuver
. Cela nous donne les indices réorganisés pour que les colonnes sortent dans l'ordre trié numériquement (M1, M2, M3, ...)@I
pour réorganiser les@F
éléments.-p
L'option Perl permet l'impression automatique du$_
contenu,-l
ajoutera lenewline
.la source
Utilisation du module Perl Sort :: Naturally
des données d'entrée
production
la source
Si l'
rs
utilitaire est installé, vous pouvez le faire:Ou tout sur une seule ligne:
rs
transpose les données d'entrée (avec des champs séparés par l'espace)sed
lit la première ligne, la sort, puis quitte, laissant le reste du tuyaurs
intact.stdbuf
est nécessaire pour garantir quesed
ne lit que jusqu'à la première nouvelle ligne et pas plus loin, en désactivant la mise en mémoire tampon d'entréesort
s les lignes restantesrs
transpose le flux résultant dans son format d'origine.rs
est installé par défaut sur MacOS. Sur les systèmes Linux, vous devrez peut-être l'installer - par exempleAttention:
stdbuf
et l' optionsort
s-V
est spécifique à GNU et ne fonctionnera donc pas sur MacOS non modifié.la source
Si vous avez GNU
awk
, vous pouvez essayer ceci:la source
En Python:
la source
Je ne sais pas si vous avez considéré cela comme une bonne réponse, mais ...
Pourquoi vous n'utilisez pas de base de données pour résoudre ce problème? vous pouvez importer votre jeu de données en tant que table temporaire, puis faire un
Vous pouvez utiliser d'autres filtres ou transformations selon vos besoins. Ensuite, vous pouvez reformater votre sortie selon vos besoins.
Toutes ces tâches peuvent être programmées en tant que script bash et chaîner les sorties à l'aide de canaux.
Parfois, j'ai utilisé la commande "pv" pour voir la progression de la sortie entre les commandes.
Pour importer l'ensemble de données, vous pouvez programmer un ETL à l'aide de Pentaho Data Integration.
la source
Cela pourrait peut-être aussi vous aider.
Ex:
la source