Pegar contenido de dos archivos con paste. Utilizar VIM para sustituir selección de una columna

Este es otro de esos posts. Sí, esos posts cortos de pequeñas utilidades que he encontrado, que son sencillas de implementar y que muchos deben conocer como muchos otros no deben conocer. Igual, espero que sean de utilidad. Ahora que estoy incursionando en la dinámica cuántica, la cual es una rama muy singular de la mecánica cuántica ya que no solo toma en cuenta la estructura electrónica de moléculas, si no también cómo estas evolucionan con el tiempo… bueno, esto no es una clases de mecánica cuántica
. Es necesario generar superficies de energía potencial, lo que implica (Ahora si viene la parte computacional del asunto) hacer unos cuántos cálculos y generar valores para entonces hacer tablas. Bueno, digamos que utilizando grep (awk también y compañía) se pueden sacar los valores necesarios de distancias internucleares (vamos a llamarlos valores de la variable a) y por otro lado, usando de nuevo grep puedo obtener valores de energía (variable b). Entonces, tengo dos archivos con el mismo número de líneas, ¿cómo los pego en un mismo archivo como dos columnas para luego graficar?. Es ahí donde paste viene al rescate. Si suponemos que los archivos se llaman a.txt y b.txt y que a.txt contiene:
2.56168000
2.75065260
2.93962520
3.12859780
3.31757040
3.50654299
3.69551559
3.88448819
4.07346079
y b.txt:
-75.52133959
-75.46050950
-75.40088665
-75.34642198
-75.29927353
-75.25976834
-75.22698494
-75.19963813
-75.17657482
Solo basta con ejecutar:
$ paste a.txt b.txt > data.tab
El contenido de data.tab luce así:

Bien, ahora puedo utilizar Gnuplot o lo que quiera para graficar. Por los momentos no he nombrado a VIM, pero ya vamos a eso.
Ahora, lo anteriormente expresado funciona bastante bien. Pero: ¿Qué tal si quiero ingresar una columna entre los valores de a y b porque quiero hacer una superficie en 3D de una colisión? En castellano, solo agregar una columna de valores fijos en la mitad de a y b. Esto se hace de la siguiente manera. Ejecutamos Ctrl+v en VIM para entrar en modo VISUAL BLOCK. Luego, seleccionamos el espacio donde queremos hacer la sustición utilizando las flechas en el teclado:
Una vez contento con la selección, se pulsa Shift + i para entrar en modo de inserción. A continuación, escribe la cantidad que quieras sustituir en toda esa columna seleccionada, en mi caso, quiero 1.000000. Como quería que el valor 1.00000 estuviera separado de la primera columna, en el modo de inserción solo luego de pulsar Shift + i agregué 6 espacios en blanco, luego escribí el valor (esto lo escribo para recalcar que en esa línea puedes editar lo que quieras) y por último pulsé la tecla ESC.
El resultado es el siguiente:
En este ejemplo es trivial. Pero para que los lectores tengan una idea, una superficie de potenciales para ser aceptable necesita al menos más de 1500 valores, hacer esto a mano (uno por uno) sería simplemente estúpido. Espero que les sea de ayuda.
Categorised as: Ciencias | Debian | Linux


Muammar, pero igual en modo visual de Vim tendrías que seleccionar las 1500 líneas del fichero, ¿o no?, al vuelo se ocurre lo siguiente:
perl -i.bak -ane ‘print “$F[0]\t1.000\t$F[1]\n”;’ data.tab
Obtienes lo siguientes:
* Respaldo de data.tab
* Editas el fichero en sitio
* Entras en modo autosplit y ordenas la entrada como gustes separadas por tabs.
HTH
Hola,
Sí, se tienen que seleccionar. Solo pulso Ctrl-v y luego Shift-g si quiero ir hasta el final, o por ejemplo: Ctrl-v, 100, Shift-g si quiero ir a la línea 100 en selección. Así que no es tanto esfuerzo
. De todas maneras, me parece bien interesante tu sugerencia. Voy a probarla. Aunque se me había olvidado comentar algo, a veces, digamos que en la iteración número 600 de 1300, se llega a cierta distancia en donde debes mantener la primera columna fija, en mi ejemplo a (utilizando el último valor que hayas empleado de esta) y luego agregar las variaciones de distancias en la fila que inserté entre a y b, es decir, adicionar a 1.000000 en este caso un ∂r. En ese sentido, creo que cambia el panorama.
Gracias por tu comentario. Un abrazo.
Espero haber entendido tu segunda inquietud, para resumir asumo que esto es el resultado del comando paste:
$ cat demo.txt
1345.4 345769.2
2345.1 785045.2
2345.1 488504.2
2345.1 759043.3
2345.1 488504.1
2345.1 759043.4
1345.2 345769.6
1345.1 345769.8
1345.7 345769.1
1345.1 345769.2
El primer procesamiento es insertarle la columna “b” de la siguiente manera:
$ perl -i -alpe ‘$_=”$F[0]\t1.000\t$F[1]“‘ demo.txt
$ cat demo.txt
1345.4 1.000 345769.2
2345.1 1.000 785045.2
2345.1 1.000 488504.2
2345.1 1.000 759043.3
2345.1 1.000 488504.1
2345.1 1.000 759043.4
1345.2 1.000 345769.6
1345.1 1.000 345769.8
1345.7 1.000 345769.1
1345.1 1.000 345769.2
Hasta ahora no he cambiado lo dicho, ahora bien, asumo que me dices: “Desde la linea 2 hasta la 6 de la columna ‘a’ la distancia no varia. Por lo tanto, a mi nueva columna ‘b’ (1.000) le voy a agregar un valor dado que es un delta”.
En este caso voy a modificar desde la linea 2 a la 6, si estoy en esas lineas le voy a agregar 3 unidades a mi nueva columna ‘b’, de lo contrario no le agregare nada y voy a formatear la salida de un modo particular:
$ perl -alpe ‘$r=2..6?3:0; $_=sprintf(“%.3f\t%.3f\t%.3f”, $F[0], $F[1]+$r, $F[2])’ demo.txt
1345.400 1.000 345769.200
2345.100 4.000 785045.200
2345.100 4.000 488504.200
2345.100 4.000 759043.300
2345.100 4.000 488504.100
2345.100 4.000 759043.400
1345.200 1.000 345769.600
1345.100 1.000 345769.800
1345.700 1.000 345769.100
1345.100 1.000 345769.200
Esto cubriría tu ultima inquietud?
Sí serviría, lo único es que en vez de sumar fijamente por 3 todas esas líneas, la idea sería ir incrementando en 3 como has escogido en tu ejemplo.
1345.400 1.000 345769.200
2345.100 4.000 785045.200
2345.100 7.000 488504.200
2345.100 10.000 759043.300
2345.100 13.000 488504.100
2345.100 16.000 759043.400
1345.200 1.000 345769.600
1345.100 1.000 345769.800
1345.700 1.000 345769.100
1345.100 1.000 345769.200
Reduciendo un poco el comando anterior y tomando ventaja de $_ puede quedar así:
perl -i.bak -alpe ‘$_=”$F[0]\t1.000\t$F[1]“‘ data.tab
Eso sería después de concentrar el fichero data.tab vía paste, si quieres hacer todas las acciones de inmediato podrías jugar con Perl Power Tools, existe una implementación de paste
http://search.cpan.org/dist/ppt/bin/paste