Como dois arquivos de texto não classificados de comprimentos diferentes podem ser exibidos lado a lado (em colunas) em umshell
Dado one.txt
e two.txt
:
$ cat one.txt
apple
pear
longer line than the last two
last line
$ cat two.txt
The quick brown fox..
foo
bar
linux
skipped a line
Exibição:
apple The quick brown fox..
pear foo
longer line than the last two bar
last line linux
skipped a line
paste one.txt two.txt
quase faz o truque, mas não alinha as colunas muito bem, pois apenas imprime uma guia entre as colunas 1 e 2. Eu sei como fazer isso com emacs e vim, mas quero que a saída seja exibida para stdout para ect de tubulação.
A solução que encontrei usa sdiff
e canaliza o sed para remover os acréscimos de saída sdiff
.
sdiff one.txt two.txt | sed -r 's/[<>|]//;s/(\t){3}//'
Eu poderia criar uma função e colocá-la no meu, .bashrc
mas certamente já existe um comando para isso (ou uma solução mais limpa potencialmente)?
linux
shell
unix
command-line
gnu-coreutils
Chris Seymour
fonte
fonte
Respostas:
Você pode usar
pr
para fazer isso, usando o-m
sinalizador para mesclar os arquivos, um por coluna, e-t
para omitir cabeçalhos, por exemplo.saídas:
Veja também:
fonte
pr
antes. Tentei com 3 arquivos e a saída estava truncada, mas a-w
opção resolveu isso. Boa resposta.$COLUMNS
, que deve ser fornecido pelo shell.pr
corta o final de linhas longas. Existe uma maneira de quebrar as linhas?Para expandir um pouco a resposta de @Hasturkun : por padrão,
pr
usa apenas 72 colunas para sua saída, mas é relativamente fácil fazê-lo usar todas as colunas disponíveis de sua janela de terminal:A maioria dos shells armazenará (e atualizará) a largura da tela do seu terminal na
$COLUMNS
variável de ambiente, portanto, estamos apenas passando esse valorpr
para usar na configuração de largura de saída.Isso também responde à pergunta de @Matt :
Então, não:
pr
ele mesmo não consegue detectar a largura da tela, mas estamos ajudando um pouco passando a largura do terminal pela-w
opção.fonte
Se você sabe que os arquivos de entrada não têm guias, usar
expand
simplifica a resposta de @oyss :Se houver guias nos arquivos de entrada, você sempre pode expandir primeiro:
fonte
O uso
*
em uma especificação de formato permite fornecer o comprimento do campo dinamicamente.fonte
diff -y one.txt two.txt
um trabalho melhor do quepaste one.txt two.txt
remover diferentes caracteres extras que são exibidossed
é trivial em comparação com escrever / lembrar umawk
script. Mesmo com ambas as funções em.bash_rc
mais tempo! = Melhor, mais legível, mais rápido .. qual é a vantagem aqui?remover dinamicamente o comprimento do campo contando da resposta de Barmar tornará o comando muito mais curto ... mas você ainda precisa de pelo menos um script para terminar o trabalho que não poderia ser evitado, não importa o método escolhido.
fonte
Se você quiser saber a diferença real entre dois arquivos lado a lado, use
diff -y
:Você também pode definir uma largura de saída usando a
-W, --width=NUM
opção:e para fazer
diff
a saída da coluna de caber na janela do terminal atual:fonte
Existe uma
sed
maneira:Debaixo bash, você poderia usar
printf -v
:(Claro que a solução de @Hasturkun
pr
é a mais precisa !) :Vantagem de
sed
maispr
Você pode escolher com precisão a largura de separação e / ou separadores:
Ou, por exemplo, para marcar linhas contendo
line
:irá renderizar:
fonte
Encontre abaixo uma solução baseada em python.
Exemplo
fonte
fonte
sdiff
é odiff -y
que discuto na pergunta.diff
adiciona caracteres entre os dois arquivos.