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)