¿Cómo se pueden mostrar dos archivos de texto sin clasificar de diferentes longitudes uno al lado del otro (en columnas) en unshell
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 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 se muestre en stdout para piping, etc.
La solución que se me ocurrió usa sdiff
y luego tuberías a sed para eliminar los sdiff
agregados de salida .
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 un comando para esto (o una solución más limpia ).
linux
shell
unix
command-line
gnu-coreutils
Chris Seymour
fuente
fuente
Respuestas:
Puede usar
pr
para hacer esto, usando la-m
bandera para fusionar los archivos, uno por columna, y-t
para omitir encabezados, por ejemplo.salidas:
Ver también:
fuente
pr
antes escuchado . Intenté con 3 archivos y la salida se truncó, pero la-w
opción resolvió eso. Buena respuesta.$COLUMNS
, que debería ser proporcionado por el shell.pr
corta el final de líneas largas. ¿Hay alguna forma de hacer que envuelva las líneas?Para expandir un poco la respuesta de @Hasturkun : de forma predeterminada,
pr
usa solo 72 columnas para su salida, pero es relativamente fácil hacer que use todas las columnas disponibles de la ventana de su terminal:La mayoría de los shell almacenarán (y actualizarán) el ancho de pantalla de su terminal en la
$COLUMNS
variable de entorno, por lo que solo estamos pasando ese valorpr
para usarlo en la configuración del ancho de salida.Esto también responde a la pregunta de @Matt :
Entonces, no: por
pr
sí solo no puede detectar el ancho de pantalla, pero estamos ayudando un poco al pasar el ancho del terminal a través de la-w
opción.fuente
Si sabe que los archivos de entrada no tienen pestañas, entonces el uso
expand
simplifica la respuesta de @oyss :Si pudiera haber pestañas en los archivos de entrada, siempre puede expandir primero:
fuente
El uso
*
de una especificación de formato le permite proporcionar la longitud del campo de forma dinámica.fuente
diff -y one.txt two.txt
un trabajo mejor quepaste one.txt two.txt
eliminar los caracteres adicionales de diffs que se muestransed
es trivial en comparación con escribir / recordar unawk
script. ¡Incluso con ambas funciones en.bash_rc
más tiempo! = Mejor, más legible, más rápido ... ¿cuál es la ventaja aquí?eliminar dinámicamente el recuento de longitud de campo de la respuesta de Barmar lo hará un comando mucho más corto ... pero aún necesita al menos un script para terminar el trabajo que no se pudo evitar sin importar el método que elija.
fuente
Si desea conocer la diferencia real entre dos archivos uno al lado del otro, use
diff -y
:También puede establecer un ancho de salida usando la
-W, --width=NUM
opción:y para hacer que
diff
la salida de la columna se ajuste a su ventana de terminal actual:fuente
Hay una
sed
forma:Debajo intento, podrías usar
printf -v
:(¡Por supuesto que la solución de @Hasturkun
pr
es la más precisa !) :Ventaja de
sed
máspr
Puede elegir con precisión el ancho de separación o los separadores:
O, como muestra, para marcar líneas que contengan
line
:rendirá:
fuente
Encuentre a continuación una solución basada en Python.
Ejemplo
fuente
fuente
sdiff
esdiff -y
lo que discuto en la pregunta.diff
agrega caracteres entre los dos archivos.