tagger tag mp3tag mac kid3 easytag linux shell unix command-line gnu-coreutils

mp3tag - tag music linux



Mostrar dos archivos uno al lado del otro (9)

Encuentre a continuación una solución basada en Python.

import sys # Specify the number of spaces between the columns S = 4 # Read the first file l0 = open( sys.argv[1] ).read().split(''/n'') # Read the second file l1 = open( sys.argv[2] ).read().split(''/n'') # Find the length of the longest line of the first file n = len(max(l0, key=len)) # Print the lines for i in xrange( max( len(l0), len(l1) ) ): try: print l0[i] + '' ''*( n - len(l0[i]) + S) + l1[i] except: try: print '' '' + '' ''*( n - 1 + S) + l1[i] except: print l0[i]

Ejemplo

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

¿Cómo se pueden mostrar 2 archivos de texto sin clasificar de diferentes longitudes una al lado de la otra (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 bien las columnas, ya que solo imprime una pestaña entre las columnas 1 y 2. Sé cómo hacerlo con emacs y vim, pero quiero que la salida se muestre en stdout para las tuberías, etc. .

La solución que encontré usa sdiff y luego canaliza a sed para eliminar la salida que 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 solución limpiadora potencialmente)?


Hay una manera sed :

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 pr @Hasturkun es la más precisa !) :


Para expandir un poco la respuesta de : de forma predeterminada, pr solo usa 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 shell''s almacenarán (y actualizarán) el ancho de pantalla de su terminal en la variable de entorno $COLUMNS , por lo que solo estamos pasando ese valor a pr para usarlo para la configuración de ancho de salida.

Esto también responde la pregunta de Matt :

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

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


Puede usar pr para hacer esto, usando el indicador -m para fusionar los archivos, uno por columna, y -t para omitir los 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


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 la opción -W, --width=NUM :

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


Si sabes que los archivos de entrada no tienen pestañas, entonces usar expand @oyss la answer @oyss :

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


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)}''


diff -y <file1> <file2> [root /]# cat /one.txt

apple pear longer line than the last two last line

[root /]# cat /two.txt

The quick brown fox.. foo bar linux

[root@RHEL6-64 /]# diff -y one.txt two.txt

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


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])} }''

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