Eu tenho os dois arquivos a seguir (preenchi as linhas com pontos para que todas as linhas de um arquivo tenham a mesma largura e tornei file1 todas maiúsculas para torná-lo mais claro).
contents of file1:
ETIAM......
SED........
MAECENAS...
DONEC......
SUSPENDISSE
contents of file2
Lorem....
Proin....
Nunc.....
Quisque..
Aenean...
Nam......
Vivamus..
Curabitur
Nullam...
Observe que o arquivo2 é maior que o arquivo1.
Quando eu executo este comando:
paste file1 file2
Eu recebo essa saída
ETIAM...... Lorem....
SED........ Proin....
MAECENAS... Nunc.....
DONEC...... Quisque..
SUSPENDISSE Aenean...
Nam......
Vivamus..
Curabitur
Nullam...
O que posso fazer para que a saída seja a seguinte?
ETIAM...... Lorem....
SED........ Proin....
MAECENAS... Nunc.....
DONEC...... Quisque..
SUSPENDISSE Aenean...
Nam......
Vivamus..
Curabitur
Nullam...
eu tentei
paste file1 file2 | column -t
mas faz isso:
ETIAM...... Lorem....
SED........ Proin....
MAECENAS... Nunc.....
DONEC...... Quisque..
SUSPENDISSE Aenean...
Nam......
Vivamus..
Curabitur
Nullam...
não tão feia quanto a saída original, mas incorreta em colunas.
text-processing
columns
paste
Tulains Córdova
fonte
fonte
paste
está usando guias na frente das linhas do segundo arquivo. Talvez você precise usar um pós-processador para alinhar as colunas adequadamente.paste file1 file2 | column -tn
?Respostas:
Supondo que você não tenha caracteres de tabulação em seus arquivos,
com o arg para
-t
escolher adequadamente para cobrir a largura máxima desejada da linha no arquivo1.O OP adicionou uma solução mais flexível:
Eu fiz isso para que funcione sem o número mágico 13:
Não é fácil digitar, mas pode ser usado em um script.
fonte
Eu pensei que o awk poderia fazer isso muito bem, então pesquisei "awk reading input from two files" e encontrei um artigo sobre o stackoverflow para usar como ponto de partida.
Primeiro é a versão condensada, depois totalmente comentada abaixo. Demorou mais do que alguns minutos para resolver. Eu ficaria feliz com alguns aprimoramentos de pessoas mais inteligentes.
E aqui está a versão totalmente documentada do acima.
fonte
Não é uma solução muito boa, mas consegui fazer isso usando
onde TAB é substituído pelo caractere de tabulação.
fonte
&&
comando sed?&
coloca o que está sendo pesquisado (uma guia nesse caso). Este comando simplesmente substitui a guia no início por duas guias.TAB
para\t
fazer isso funcionar no zsh no Ubuntu debian. E ele faz só funcionam se file1 tem menos de 15 caracteresNo Debian e derivativos,
column
tem uma opção-n
nomerge que permite que a coluna faça a coisa certa com campos vazios. Internamente,column
usa awcstok(wcs, delim, ptr)
função, que divide uma cadeia de caracteres ampla em tokens delimitados pelos caracteres largos nodelim
argumento.wcstok
começa pulando caracteres largosdelim
antes de reconhecer o token. A-n
opção usa um algoritmo que não ignora caracteres largos iniciaisdelim
.Infelizmente, isso não é muito portátil:
-n
é específico do Debian ecolumn
não está no POSIX, é aparentemente uma coisa do BSD.fonte
Retirando os pontos que você usou para preenchimento:
file1:
arquivo2:
Tente o seguinte:
E você receberá:
fonte
paste
, falhará ao imprimir a saída adequada se houver alguma linha contendo guias. +1 por ser diferenteUma
awk
solução que deve ser razoavelmente portátil e deve funcionar para um número arbitrário de arquivos de entrada:fonte
paste-awk
e tenteipaste file1 file2|paste-awk
e tentei,awk paste-awk file1 file2
mas nenhum funcionou.awk: Line:1: (FILENAME=file1 FNR=1) Fatal: Division by zero
awk -f paste-awk file1 file2
deve funcionar, pelo menos para GNU awk e mawk.paste
pois há menos espaço entre as duas linhas. E se o arquivo de entrada tem nem todas as linhas mesmo comprimento, que irá resultar em uma alinhar com o botão direito linha-F\\t