Necesito ordenar las columnas de un conjunto de datos muy grande (1000 líneas y 700000 columnas). Como ejemplo, mis columnas están ordenadas aleatoriamente como: col1 col4 col3 col2, y necesito ordenar eso.
He estado intentando algunos comandos, pero no he tenido éxito.
ejemplo:
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
En este ejemplo, los puntos significan que tengo muchas columnas y líneas. Nuevamente, necesito ordenar las columnas para que sean como:
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
Gracias
text-processing
awk
LLVerardo
fuente
fuente
Respuestas:
Con GNU
datamash
y GNUsort
:Esto funciona bien para datos "razonablemente pequeños". Puede o no funcionar con su archivo.
Editar: Las soluciones a continuación sin transposiciones deberían consumir menos recursos.
fuente
datamash
por ejemplors -T < file_in.csv | sort | rs -T -C' '
(rs
debe estar disponible como un paquete en sistemas basados en Debian)rs
("remodelar una matriz de datos") está disponible en los sistemas base de algunos BSD.M
aparece al principio, usando el bien conocidoSchwartzian maneuver
. Esto nos proporciona los índices reordenados para que las columnas salgan ordenadas numéricamente (M1, M2, M3, ...)@I
para reorganizar los@F
elementos.-p
La opción de Perl habilita la impresión automática de$_
contenidos,-l
agregará elnewline
.fuente
Usando el módulo perl Ordenar :: Naturalmente
los datos de entrada
salida
fuente
Si tiene instalada la
rs
utilidad , puede hacer esto:O todo en una línea:
rs
transpone los datos de entrada (con campos espaciados)sed
lee la primera línea, la emite y luego se cierra, dejandors
intacto el resto de la tubería .stdbuf
es necesario para garantizar quesed
solo se lee hasta la primera línea nueva y no más, al desactivar el almacenamiento en búfer de entradasort
s las líneas restantesrs
transpone la secuencia resultante a su formato original.rs
se instala por defecto en MacOS. En los sistemas Linux puede que tenga que instalarlo, p. Ej.Advertencia:
stdbuf
ysort
s-V
opción son específicas de GNU así que no funcionará en MacOS no modificados.fuente
Si tienes GNU
awk
, puedes probar esto:fuente
En Python:
fuente
No sé si consideraste esto como una buena respuesta, pero ...
¿Por qué no usa una base de datos para resolver este problema? puede importar su conjunto de datos como una tabla temporal y luego hacer un
Puede usar otros filtros o transformaciones según lo necesite. Luego, puede formatear su salida según lo necesite.
Todas estas tareas podrían programarse como un script bash y encadenar salidas utilizando tuberías.
A veces se me ha utilizado el comando "pv" para ver el progreso de salida entre comandos.
Para importar el conjunto de datos, puede programar un ETL utilizando Pentaho Data Integration.
fuente
Quizás esto también te pueda ayudar.
Ex:
fuente