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.