Comparação linha-a-linha ingênua como “comm -3” mas parecendo “diff -y”

3

Eu estou olhando de algo que me dá uma saída de comm -3 em duas saídas classificadas (comparação linha por linha, apenas linhas adicionais / ausentes de qualquer lado), mas que se parece mais com a saída de diff -y , por exemplo na medida em que usa toda a largura.

file1 :

bar/a
bar/feugiat
bar/libero
bar/mauris
bar/scelerisque
bar/urna
foo/blandit
foo/elementum
foo/feugiat
foo/laoreet
foo/luctus
foo/non
foo/pellentesque
foo/pulvinar
foo/rutrum
foo/sed
foo/ut
foo/vivamus

file2 :

bar/a
bar/molestie
bar/quam
bar/risus
bar/tristique
foo/blandit
foo/elementum
foo/feugiat
foo/ligula
foo/massa
foo/mauris
foo/metus
foo/pellentesque
foo/pulvinar
foo/ut

Saída de comm -3 file1 file2 :

bar/feugiat
bar/libero
bar/mauris
        bar/molestie
        bar/quam
        bar/risus
bar/scelerisque
        bar/tristique
bar/urna
foo/laoreet
        foo/ligula
foo/luctus
        foo/massa
        foo/mauris
        foo/metus
foo/non
foo/rutrum
foo/sed
foo/vivamus

Saída de diff -y --suppress-common-lines file1 file2 (GNU), depende da largura da tela:

bar/feugiat                                                   | bar/molestie
bar/libero                                                    | bar/quam
bar/mauris                                                    | bar/risus
bar/scelerisque                                               | bar/tristique
bar/urna                                                      <
foo/laoreet                                                   | foo/ligula
foo/luctus                                                    | foo/massa
foo/non                                                       | foo/mauris
                                                              > foo/metus
foo/rutrum                                                    / foo/ut
foo/sed                                                       <
foo/ut                                                        <
foo/vivamus                                                   <

Possível saída que eu desejaria:

bar/feugiat                                                   <
bar/libero                                                    <
bar/mauris                                                    <
                                                              > bar/molestie
                                                              > bar/quam
                                                              > bar/risus
bar/scelerisque                                               <
                                                              > bar/tristique
bar/urna                                                      <
foo/laoreet                                                   <
                                                              > foo/ligula
foo/luctus                                                    <
                                                              > foo/massa
                                                              > foo/mauris
                                                              > foo/metus
foo/non                                                       <
foo/rutrum                                                    <
foo/sed                                                       <
foo/vivamus                                                   <

Sem as setas também, a largura da tela deve ser melhor:

bar/feugiat
bar/libero
bar/mauris
                                                                bar/molestie
                                                                bar/quam
                                                                bar/risus
bar/scelerisque
                                                                bar/tristique
bar/urna
foo/laoreet
                                                                foo/ligula
foo/luctus
                                                                foo/massa
                                                                foo/mauris
                                                                foo/metus
foo/non
foo/rutrum
foo/sed
foo/vivamus
    
por phk 24.02.2017 / 14:24

1 resposta

5

Você pode enviar para:

expand -t "$((${COLUMNS:-$(tput cols)} / 2))"

Ou para os colchetes angulares:

awk -v cols="${COLUMNS:-$(tput cols)}" '
  BEGIN {width = cols/2-1; space = sprintf("%*s", width, "")}
  /^\t/ {print space ">", substr($0, 2); next}
  {printf "%-*s<\n", width, $0}'

Se o seu tput não produzir o número de colunas, você poderá tentar analisar a saída de stty size ou stty -a . Ou use zsh -c 'echo $COLUMNS' (também funciona com mksh ). Não há uma maneira padrão / portátil de obter essa informação.

Se os arquivos de entrada contiverem caracteres de múltiplos bytes ou de largura dupla, YMMV. Dependendo do alinhamento de implementação expand / awk , pode estar desativado.

Isso também pressupõe que os arquivos de entrada não possuem linha que inicie com um caractere de tabulação. Se isso não puder ser garantido, a implementação GNU de comm tem --output-delimiter , que você pode usar para especificar uma string única. Ou você pode implementar a funcionalidade comm em awk , o que não deve ser muito complicado.

    
por 24.02.2017 / 14:37