Eu tenho um arquivo com as linhas abaixo.
title1:A1
title2:A2
title3:A3
title4:A4
title5:A5
title1:B1
title2:B2
title3:B3
title4:B4
title5:B5
title1:C1
title2:C2
title3:C3
title4:C4
title5:C5
title1:D1
title2:D2
title3:D3
title4:D4
title5:D5
Como posso conseguir isso?
title1 title2 title3 title4
A1 A2 A3 A4
B1 B2 B3 B4
C1 C2 C3 C4
D1 D2 D3 D4
text-processing
columns
Dens
fonte
fonte
Respostas:
Dê uma olhada no GNU datamash que pode ser usado como
datamash transpose
. Uma versão futura também suportará tabulação cruzada (tabelas dinâmicas)fonte
Fora a implementação de uma solução personalizada para transpor linhas com colunas de uma linha de comando, a única ferramenta que eu já vi que pode fazer isso é uma ferramenta chamada ironicamente
transpose
.Instalação
Infelizmente, ele não está em nenhum repositório, portanto você precisará fazer o download e compilá-lo. Isso é bem direto, pois não possui bibliotecas adicionais das quais depende. Isso pode ser realizado da seguinte maneira:
Uso
Ele pode lidar com arquivos de texto simples com facilidade. Por exemplo:
Pode ser transposto usando este comando:
Este comando é
transpose
para transpose (-t
) e o separador de campos a ser usado é um espaço (--fsep " "
).Seu exemplo
Como os dados da amostra estão em um formato um pouco mais complexo, eles precisam ser tratados em duas fases. Primeiro, precisamos traduzi-lo para um formato que
transpose
possa lidar.A execução deste comando colocará os dados em um formato mais horizontalmente amigável:
Agora só precisamos remover as ocorrências secundárias do título1, título2, etc .:
Agora está em um formato que
transpose
pode lidar. O comando a seguir fará toda a transposição:fonte
Você pode usar
awk
para processar os dadospaste
ecolumn
formatá-los.Aqui, suponho que
title1
seja apenas um exemplo em sua postagem, e que os dados não contenham,:
exceto como separador entre o cabeçalho + os dados.n
significa quantas colunas imprimir (deve corresponder traçospaste
).Se você quiser torná-lo mais flexível e fácil de manter, você pode escrevê-lo como um script. Aqui está um exemplo usando o bash wrapper para
awk
e canalizado paracolumn
. Dessa forma, você também pode fazer mais verificações de dados, como, por exemplo, garantir que os cabeçalhos estejam corretos em todas as linhas, etc.Usado tipicamente como:
Se os cabeçalhos sempre forem mais curtos que os dados, você também poderá salvar as larguras dos cabeçalhos,
printf
com%-*s
e pularcolumn
todos juntos.fonte
Aqui está uma maneira rápida de colocar o arquivo no formato desejado:
Se você deseja os cabeçalhos das colunas:
Como o 2º comando funciona
imprimindo o banner retornando após o banner em imprimindo as linhas de dadosfonte
Utilitário GNUS datamash
Retirado deste site, https://www.gnu.org/software/datamash/ e http://www.thelinuxrain.com/articles/transposing-rows-and-columns-3-methods
fonte
Provavelmente existe uma maneira mais sucinta de formular isso, mas isso parece alcançar o efeito geral:
Múltiplas
sed
invocações não parecem certas (e tenho certeza que o sed também pode fazer a tradução de novas linhas), portanto, provavelmente não é a maneira mais direta de fazê-lo. Além disso, isso remove os possíveis cabeçalhos, mas você pode gerá-los manualmente quando tiver as linhas / campos formatados corretamente.Uma resposta melhor provavelmente destilaria esse efeito usando apenas
sed
ouawk
fazendo isso, para que você só tenha uma coisa acontecendo de cada vez. Mas estou cansado, então foi isso que consegui montar.fonte
paste
provavelmente é sua melhor aposta. Você pode extrair os bits relevantes comcut
,grep
eawk
assim:Se a 5ª coluna for eliminada, acrescente
awk 'NR%5'
seguinte forma:Agora colabore com
paste
:Resultado:
fonte
Apenas para a parte de transposição, tive um problema semelhante recentemente e usei:
Ajuste o fmt conforme necessário. Para cada linha de entrada, concatena cada campo em um elemento da matriz. Observe que a concatenação de strings awk está implícita: isso acontece quando você escreve duas coisas sem nenhum operador.
E / S de amostra:
resultado:
fonte
A coisa mais simples que você pode fazer é
cut
recortar os campos e depois usartr
se estiver transpondo linhas para colunas, substituindo o caractere de nova linha por um caractere de tabulação: http://www.gnu.org/software/coreutils/manual/ coreutils.html # tr-invocationfonte
cut
retorna um erro.