Eu tenho três arquivos contendo uma sequência classificada de números, um por linha:
file1
1
2
3
arquivo2
1
3
4
arquivo3
1
5
Eu quero "alinhar" esses três arquivos lado a lado como o seguinte:
file1 file2 file3
1 1 1
2
3 3
4
5
Eu tentei com, sdiff
mas ele só funciona com 2 arquivos
text-processing
awk
diff
cheseaux
fonte
fonte
diff3
?diff3
não possui esse formato de saída.diff3
e como @ Kusalananda afirmou corretamente, ele não produz essa saída. Além disso, eu estou procurando uma solução genérica (para n arquivos, n> 2)5
na quinta linha o resultado é o terceiro?Respostas:
Você pode processar cada arquivo e imprimir uma linha com algum caractere, por exemplo,
X
para cada número ausente na sequência 1 a max (onde max é o último número desse arquivo),paste
os resultados substituem esse caractere por espaço:Se um determinado valor estiver ausente de todos os arquivos, você obterá linhas vazias na saída (na verdade elas não estão vazias, elas contêm apenas espaços em branco).
Para removê-los, substitua
tr X ' '
porsed '/[[:digit:]]/!d;s/X/ /g'
Além disso, se você precisar de um cabeçalho, sempre poderá executar algo assim primeiro:fonte
;1
parte no final. Estou usando{print $0}
, em vez disso, um IMHO um pouco menos enigmático. De qualquer forma, obrigado novamenteUma solução geral com o awk: requer o GNU awk
Adotou uma abordagem diferente e mais simples, com base no comentário de Don:
fonte
Uma solução com
bash
,join
,paste
, e mau gosto:Exceto pelo último
sort -n
, tudo isso funciona com itens de texto em vez de números, desde que os itens não contenham guias (masTAB
podem ser alterados para qualquer outro separador). Além disso, isso poderia ser feito com apenas 3 arquivos temporários e algumas coisas aleatórias (mas isso apenas aumentaria o mau gosto).fonte