Pregunta Mostrar dos archivos uno al lado del otro


¿Cómo se pueden mostrar 2 archivos de texto sin clasificar de diferentes longitudes uno al lado del otro? (en columnas) en un shell 

Dado one.txt y 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

Monitor:

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 casi hace el truco pero no alinea las columnas muy bien, ya que solo imprime una pestaña entre la columna 1 y 2. Sé cómo hacerlo con emacs y vim, pero quiero que la salida muestre stdout para piping ect.

La solución que ideé usa sdiff y luego canaliza a sed para eliminar la salida sdiff agrega.

sdiff one.txt two.txt | sed -r 's/[<>|]//;s/(\t){3}//'

Podría crear una función y pegarla en mi .bashrc pero seguramente ya existe una orden para esto (o una limpiador solución potencialmente)?


75
2017-11-12 10:15


origen


Respuestas:


Puedes usar pr para hacer esto, usando el -m marcar para fusionar los archivos, uno por columna, y -t omitir encabezados, ej.

pr -m -t one.txt two.txt

productos:

apple                               The quick brown fox..
pear                                foo
longer line than the last two       bar
last line                           linux

                                    skipped a line

134
2017-11-12 12:44



Para ampliar un poco en @HasturkunLa respuesta de s: por defecto pr usa solo 72 columnas para su salida, pero es relativamente fácil hacer que use todas las columnas disponibles de su ventana de terminal:

pr -w $COLUMNS -m -t one.txt two.txt

La mayoría de los depósitos almacenarán (y actualización) ancho de pantalla de su terminal en el $COLUMNS variable de entorno, por lo que simplemente estamos pasando ese valor a pr para usar para la configuración del ancho de salida.

Esto también responde @Matepregunta:

¿Hay alguna forma de que pr detecte automáticamente el ancho de la pantalla?

Entonces, no: pr en sí no puede detectar el ancho de pantalla, pero estamos ayudando un poco al pasar el ancho de la terminal a través del -w opción.


24
2018-05-08 13:40



paste one.txt two.txt | awk -F'\t' '{
    if (length($1)>max1) {max1=length($1)};
    col1[NR] = $1; col2[NR] = $2 }
    END {for (i = 1; i<=NR; i++) {printf ("%-*s     %s\n", max1, col1[i], col2[i])}
}'

Utilizando * en una especificación de formato le permite suministrar la longitud del campo de forma dinámica.


6
2017-11-12 10:47



Si sabe que los archivos de entrada no tienen pestañas, entonces use expand simplifica @oysses responder:

paste one.txt two.txt | expand --tabs=50

Si puede haber pestañas en los archivos de entrada, siempre puede expandir primero:

paste <(expand one.txt) <(expand two.txt) | expand --tabs=50

4
2017-08-25 06:11



eliminar dinámicamente el recuento de la longitud de campo de la respuesta de Barmar lo convertirá en un comando mucho más corto ... pero todavía necesita al menos un script para terminar el trabajo que no podría evitarse sin importar el método que elija.

paste one.txt two.txt |awk -F'\t' '{printf("%-50s %s\n",$1,$2)}'

2
2017-11-12 12:17



Hay un sed camino:

f1width=$(wc -L <one.txt)
f1blank="$(printf "%${f1width}s" "")"
paste one.txt two.txt |
    sed "
        s/^\(.*\)\t/\1$f1blank\t/;
        s/^\(.\{$f1width\}\) *\t/\1 /;
    "

(Por supuesto la solución de @Hasturkun pr es el Más precisa!:


1
2018-01-04 14:43



Si desea saber la diferencia real entre dos archivos, use el comando below

diff -y file1.cf file2.cf

también puede establecer el ancho para imprimir columnas usando -W, --width=NUM opción:

diff -y -W 150 file1.cf file2.cf

1
2018-01-12 10:12



diff -y <file1> <file2>


[root /]# cat /one.txt
manzana
Pera
línea más larga que las dos últimas
Última línea
[root /]# cat /two.txt
El veloz zorro marrón..
foo
bar
linux
[root@RHEL6-64 /]# diff -y one.txt two.txt
manzana | El veloz zorro marrón..
pera | foo
línea más larga que las dos últimas | bar
última línea | linux

0
2018-01-01 11:49