Preciso classificar as colunas de um conjunto de dados muito grande (1000 linhas e 700000 colunas). Como exemplo, minhas colunas são organizadas aleatoriamente como: col1 col4 col3 col2, e eu preciso classificar isso.
Eu tenho tentado alguns comandos, mas sem sucesso.
exemplo:
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
Neste exemplo, pontos significa que tenho muitas colunas e linhas. Novamente, eu preciso classificar as colunas para que sejam 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
Obrigado
text-processing
awk
LLVerardo
fonte
fonte
Respostas:
Com GNU
datamash
e GNUsort
:Isso funciona bem para dados "razoavelmente pequenos". Pode ou não funcionar com seu arquivo.
Edit: As soluções abaixo sem transposições devem ser menos intensivas em recursos.
fonte
datamash
egrs -T < file_in.csv | sort | rs -T -C' '
(rs
deve estar disponível como um pacote em sistemas baseados em Debian)rs
("remodelar uma matriz de dados") está disponível nos sistemas básicos de alguns BSDs.M
ocorrer no início, usando o bem conhecidoSchwartzian maneuver
. Isso nos fornece os índices reordenados para que as colunas saiam em ordem numericamente classificada (M1, M2, M3, ...)@I
para reorganizar os@F
elementos.-p
opção para Perl habilita a impressão automática de$_
conteúdo,-l
deve adicionar onewline
.fonte
Usando o módulo perl Sort :: Naturally
dados de entrada
resultado
fonte
Se você tiver o
rs
utilitário instalado, poderá fazer o seguinte:Ou tudo em uma linha:
rs
transpõe os dados de entrada (com campos com economia de espaço)sed
lê a primeira linha, sai e sai, deixando o restante do tubors
intocado.stdbuf
é necessário para garantir quesed
apenas seja lida até a primeira nova linha e não mais, desativando o buffer de entradasort
s as linhas restantesrs
transpõe o fluxo resultante de volta ao seu formato original.rs
é instalado por padrão no MacOS. Nos sistemas Linux, pode ser necessário instalá-lo - por exemplo,Advertência:
stdbuf
esort
a-V
opção s são específicas do GNU, portanto não funcionarão no MacOS não modificado.fonte
Se você possui o GNU
awk
, pode tentar o seguinte:fonte
Em Python:
fonte
Não sei se você considerou isso uma boa resposta, mas ...
Por que você não usa um banco de dados para resolver esse problema? você pode importar seu conjunto de dados como uma tabela temporária e fazer uma
Você pode usar outros filtros ou transformações conforme necessário. Em seguida, você pode reformatar sua saída conforme necessário.
Todas essas tarefas podem ser programadas como um script bash e encadear saídas usando pipes.
Às vezes, tenho sido usado o comando "pv" para ver o progresso da saída entre os comandos.
Para importar o conjunto de dados, você pode programar um ETL usando o Pentaho Data Integration.
fonte
Talvez isso também possa ajudá-lo.
Ex:
fonte