unir txt solo programa para love concatenar con combine archivos linux perl sed awk ksh

linux - txt - unir dos archivos con awk



cómo fusionar dos archivos consistentemente línea por línea (5)

Este trazador de líneas Perl mostrará los nuevos nombres necesarios

perl -e ''open $f[$_-1], "file$_.txt" for 1,2; print "rename @n/n" while chomp(@n = map ''''.<$_>, @f)''

Si esto funciona para usted, reemplace la declaración de print con un cambio de nombre real y uso

perl -e ''open $f[$_-1], "file$_.txt" for 1,2; rename @n while chomp(@n = map ''''.<$_>, @f)''

para hacer el cambio de nombre real

Tengo dos archivos ( archivo1.txt y archivo2.txt ), los archivos son solo ejemplos.

Cómo fusionar los dos archivos, para crear el archivo - merge_files.txt como ejemplo 3

Escribo ahora el script ksh, así que la fusión se puede hacer con ksh, awk, sed, perl one liner ... etc.

Antecedentes: por qué necesito fusionar los archivos: mi objetivo es cambiar el nombre del archivo VIEJO (existe en el primer campo) al archivo NUEVO (existe en el segundo campo),

Ejemplo 1

more file1.txt /etc/port1-192.9.200.1-255.555.255.0 /etc/port2-192.9.200.1-255.555.255.0 /etc/port3-192.9.200.1-255.555.255.0 /etc/port4-192.9.200.1-255.555.255.0 /etc/port5-192.9.200.1-255.555.255.0 . . . .

ejemplo2

more file2.txt /etc/port1-192.90.2.1-255.555.0.0 /etc/port2-192.90.2.1-255.555.0.0 /etc/port3-192.90.2.1-255.555.0.0 /etc/port4-192.90.2.1-255.555.0.0 /etc/port5-192.90.2.1-255.555.0.0 . . . .

ejemplo3

more merge_files.txt /etc/port1-192.9.200.1-255.555.255.0 /etc/port1-192.90.2.1-255.555.0.0 /etc/port2-192.9.200.1-255.555.255.0 /etc/port2-192.90.2.1-255.555.0.0 /etc/port3-192.9.200.1-255.555.255.0 /etc/port3-192.90.2.1-255.555.0.0 /etc/port4-192.9.200.1-255.555.255.0 /etc/port4-192.90.2.1-255.555.0.0 /etc/port5-192.9.200.1-255.555.255.0 /etc/port5-192.90.2.1-255.555.0.0 . . . . .

example4 (estructura merge_files.txt)

first field second field OLD file NEW file


Maneras completamente independientes de lograr el objetivo de OP de cambiar el nombre de los archivos numerados:

for f in {1..5}; do mv /etc/port$d-192.9.200.1-255.555.255.0 /etc/port$d-192.90.2.1-255.555.0.0; done

Otra posibilidad basada en rename

rename ''s/192.9.200.1/192.90.2.1/'' /etc/port[1-5]-192.9.200.1-255.555.255.0


Puede usar paste para formatear los archivos uno al lado del otro:

$ paste -d" " file1.txt file2.txt /etc/port1-192.9.200.1-255.555.255.0 /etc/port1-192.90.2.1-255.555.0.0 /etc/port2-192.9.200.1-255.555.255.0 /etc/port2-192.90.2.1-255.555.0.0 /etc/port3-192.9.200.1-255.555.255.0 /etc/port3-192.90.2.1-255.555.0.0 /etc/port4-192.9.200.1-255.555.255.0 /etc/port4-192.90.2.1-255.555.0.0 /etc/port5-192.9.200.1-255.555.255.0 /etc/port5-192.90.2.1-255.555.0.0

P.ej:

$ paste -d" " file1.txt file2.txt | while read from to; do echo mv "${from}" "${to}"; done mv /etc/port1-192.9.200.1-255.555.255.0 /etc/port1-192.90.2.1-255.555.0.0 mv /etc/port2-192.9.200.1-255.555.255.0 /etc/port2-192.90.2.1-255.555.0.0 mv /etc/port3-192.9.200.1-255.555.255.0 /etc/port3-192.90.2.1-255.555.0.0 mv /etc/port4-192.9.200.1-255.555.255.0 /etc/port4-192.90.2.1-255.555.0.0 mv /etc/port5-192.9.200.1-255.555.255.0 /etc/port5-192.90.2.1-255.555.0.0

Por supuesto, desearía incluir algunos controles de seguridad ( [ -f "${from}" ] , ...).

Descargo de responsabilidad: funciona solo si no hay espacios en sus nombres de archivo.


mando

paste file1 file2

salida

/etc/port1-192.9.200.1-255.555.255.0 /etc/port1-192.90.2.1-255.555.0.0 /etc/port2-192.9.200.1-255.555.255.0 /etc/port2-192.90.2.1-255.555.0.0 /etc/port3-192.9.200.1-255.555.255.0 /etc/port3-192.90.2.1-255.555.0.0 /etc/port4-192.9.200.1-255.555.255.0 /etc/port4-192.90.2.1-255.555.0.0 /etc/port5-192.9.200.1-255.555.255.0 /etc/port5-192.90.2.1-255.555.0.0


paste -d " " file1.txt file2.txt

Funciona muy bien para este trabajo. Pero en caso de que maneje archivos de texto en un entorno de Windows y utilice GNU paste, asegúrese de transformar los archivos a formato Unix (CR) y no usar archivos con (CR-LF).

Parece que GNU paste no maneja los formatos de DOS correctamente y el análisis es impredecible, el resultado esperado es errático e inesperado sin advertencias.

Puede usar GVIM para transformarlos fácilmente (Editar / Configuración de archivo / Formato de archivo)