Como posso usar awk
na seguinte situação?
Quero concatenar linhas que começam com a mesma coluna. Apenas a primeira coluna é mantida após a juntar-se (neste caso aaa
, www
, hhh
).
O arquivo pode ser separado por espaço ou tabulação.
Exemplo de entrada:
aaa bbb ccc ddd NULL NULL NULL
aaa NULL NULL NULL NULL NULL NULL
aaa bbb ccc NULL NULL NULL NULL
www yyy hhh NULL NULL NULL NULL
hhh 111 333 yyy ooo hyy uuuioooy
hhh 111 333 yyy ooo hyy NULL
Saída desejada:
aaa bbb ccc ddd NULL NULL NULL NULL NULL NULL NULL NULL NULL bbb ccc NULL NULL NULL NULL
www yyy hhh NULL NULL NULL NULL
hhh 111 333 yyy ooo hyy uuuioooy 111 333 yyy ooo hyy NULL
O pano de fundo disso é que eu quero configurar um banco de dados baseado em arquivo muito simples, em que a primeira coluna seja sempre o identificador da entidade. Todas as linhas baseadas na mesma coluna identificadora são concatenadas.
text-processing
sed
awk
minúsculo
fonte
fonte
uuu
linha (na saída)?Respostas:
Para obter as primeiras colunas em cada linha usando o awk, você pode fazer o seguinte:
Essas são suas chaves para o restante das linhas. Portanto, você pode criar uma tabela de hash, usando a primeira coluna como chave e a segunda coluna da linha como valor:
Para obter o restante da linha, começando na coluna 2, você precisa coletar todas as colunas:
fonte
Outra pessoa pode responder em awk ou sed, mas uma versão em Python é direta e pode ser útil para você.
fonte
Esta é uma aplicação mais interessante do coreutils, suspeito que não seja muito eficiente com entrada grande, pois invoca junção para cada linha da entrada.
Para melhorar sua eficiência, salvar
outfile
etmp
usar um ramdisk pode ajudar.Editar
Ou sem arquivos temporários:
fonte
E aqui está uma linha PERL:
fonte