Imprime dois arquivos em duas colunas

4

Eu quero imprimir dois arquivos em duas colunas - primeiro arquivo no lado esquerdo e segundo no lado direito.

paste não faz o trabalho, pois só pode inserir um caractere como delimitador. Se o primeiro arquivo tiver linhas com comprimentos diferentes, a saída será distorcida:

$ cat file1
looooooooong line
line
$ cat file2
hello
world
$ paste file1 file2
looooooooong line   hello
line    world

Se fosse um comando para adicionar espaços à direita como fmt --add-spaces --width 50 , o problema seria resolvido:

$ paste <(fmt --add-spaces --width 50 file1) file2
looooooooong line                                 hello
line                                              world

Mas não conheço uma maneira simples de fazer isso.

Então, como mesclar e imprimir vários arquivos horizontalmente sem torcer? Na verdade, eu só quero olhar para eles simultaneamente.

UPD: comandos hipotéticos para adicionar espaços à direita (por exemplo, xargs -d '\n' printf '%-50s\n' )

Mas vale a pena notar que a solução

$ paste <(adding-spaces-command file1) file2

não funcionará como esperado quando o arquivo1 contiver uma quantidade menor de linhas do que o arquivo2.

    
por belkka 16.09.2017 / 20:06

4 respostas

5

Que tal paste file{1,2}| column -s $'\t' -tn ?

looooooooong line line  hello
line                    world
  • Isso está dizendo column para usar o separador Tab as colunas onde nós o pegamos do comando paste que é o separador padrão lá se não for especificado; geralmente:

    paste -d'X' file{1,2}| column -s $'X' -tn
    

    onde X significa qualquer caractere único. Sua necessidade de escolher o que concedeu que não ocorrerá em seus arquivos.

  • A opção -t é usada para determinar o número de colunas que a entrada contém.

  • Isso não adicionará uma tabulação longa entre dois arquivos enquanto outras respostas o fazem.
  • isto funcionará mesmo se houver linha (s) vazia (s) no arquivo1 e não imprimir o segundo arquivo na área de impressão do arquivo1 , veja abaixo entrada / saída

    Arquivo de entrada1:

    looooooooong line
    
    line
    

    Arquivo de entrada2:

    hello
    world
    

    Saída:

    looooooooong line  hello
                       world
    line
    
por 16.09.2017 / 20:19
8

Com o comando pr único:

pr -Tm file[12]
  • -T ( --omit-pagination ) - omite cabeçalhos de página e trailers, elimine qualquer paginação por feeds de formulário definidos nos arquivos de entrada

  • -m ( --merge ) - imprime todos os arquivos em paralelo, um em cada coluna

por 16.09.2017 / 20:28
1

Uma solução portátil:

$ paste file1 file2 | awk -F'\t' '{ printf("%-30s %s\n", $1, $2) }'
looooooooong line              hello
line                           world

Isso usa paste para produzir uma entrada delimitada por tabulação para awk .

O script awk simplesmente pega os dois campos delimitados por tabulações e os envia usando printf() . Uma coluna de 30 caracteres é reservada para o primeiro arquivo. O %-30s significa "30 posições de dados de string com alinhamento à esquerda". Remover o - produziria uma coluna alinhada à direita e a alteração de 30 alteraria a largura da coluna.

Ele também lida com arquivos de tamanho irregular. Aqui eu adicionei linhas ao segundo arquivo:

looooooooong line              hello
line                           world
                               hello
                               world
                               hello
                               world

E, ao reverter a ordem dos arquivos na linha de comando:

hello                          looooooooong line
world                          line
hello
world
hello
world
    
por 16.09.2017 / 20:14
1

Tente:

paste -d '\n' file1 file2 | xargs -d '\n' printf '%-30s  %-30s\n'

Inspirado pela @solução de Kusalananda .

Nota: O parâmetro -d de xargs está disponível apenas na versão GNU, mas não no BSD.

    
por 16.09.2017 / 21:05