El objeto del script que estoy haciendo es comparar dos series de archivos. Los nombres de los archivos se almacenan en dos archivos separados, una ruta por línea. Mi idea es tener dos while read
bucles, uno para cada lista de nombres de archivo, pero ¿cómo puedo mezclar los dos bucles?
while read compareFile <&3; do
if [[ ! $server =~ [^[:space:]] ]] ; then #empty line exception
continue
fi
echo "Comparing file - $compareFile"
if diff "$compareFile" _(other file from loop?_) >/dev/null ; then
echo Same
else
echo Different
fi
done 3</infanass/dev/admin/filestoCompare.txt
Necesito poder comparar archivos de dos listas diferentes al mismo tiempo a través de dos mientras leo bucles ... ¿Es esto posible?
bash
shell-script
control-flow
mkrouse
fuente
fuente
diff
.diff
.Respuestas:
No necesitas dos bucles; solo necesita leer dos archivos en un bucle.
fuente
Método 1: usa lo que sabes
Como ya sabe cómo recorrer un archivo, puede combinar los archivos y luego procesarlos. El comando
paste
une dos archivos línea por línea. Pone una pestaña entre las líneas que provienen de los dos archivos, por lo que esta solución supone que no hay pestañas en los nombres de los archivos. (Puede cambiar el separador, pero debe encontrar un carácter que no esté presente en un nombre de archivo).Si desea omitir las líneas en blanco, debe hacerlo en cada archivo por separado, ya que
paste
podría coincidir con una línea en blanco de un archivo con una línea no en blanco de otro archivo. Puede usargrep
para filtrar las líneas no en blanco.Tenga en cuenta que si los dos archivos tienen longitudes diferentes, obtendrá un espacio vacío
$file2
(independientemente de qué lista finalizó primero).Método 2: recorrer dos archivos
Puede poner un comando tan complejo como desee en la condición del bucle while. Si lo coloca
read file1 <&3 && read file2 <&4
, el ciclo se ejecutará siempre que ambos archivos tengan una línea para leer, es decir, hasta que se agote un archivo.Si desea omitir las líneas en blanco, es un poco más complicado, ya que debe omitir los dos archivos de forma independiente. La manera fácil es dividir el problema en dos partes: omita las líneas en blanco de un archivo y procese las líneas que no están en blanco. Un método para omitir las líneas en blanco es procesarlo
grep
como se indicó anteriormente. Tenga cuidado con el espacio necesario entre el<
operador de redireccionamiento y el<(
que inicia una suscripción de comando.Otro método es escribir una función que se comporte como
read
pero salte las líneas en blanco. Esta función puede funcionar llamandoread
a un bucle. No tiene que ser una función, pero una función es el mejor enfoque, tanto para organizar su código como porque ese código debe llamarse dos veces. En la función,${!#}
es una instancia de la construcción bash${!VARIABLE}
que evalúa el valor de la variable cuyo nombre es el valor deVARIABLE
; aquí la variable es la variable especial#
que contiene el número de parámetro posicional, por lo que${!#}
es el último parámetro posicional.fuente
-u
opción de lecturaUn enfoque sería usar en
read -ra
lugar de soloread
. Suponiendo que lasfilestoCompare.txt
contenidas 2 columnas con los nombres de los archivos en cada uno, laread -ra
leerían en ambas columnas al mismo tiempo y asignarlos en una matriz,compareFile
. Se puede acceder a esta matriz para que el índice 0 sea el primer archivo y el índice 1 sea el segundo archivo cada vez a través delwhile
bucle.Ejemplo
Digamos que tengo este archivo:
filestoCompare.txt
y contiene lo siguiente:El comando para revisar este archivo sería el siguiente:
Si los 2 archivos son de hecho archivos separados como:
Se pueden unir con el
paste
comando de la siguiente manera:Aquí está el contenido de list1and2:
fuente
join
ellos primero.paste
para unir los 2 archivos? ¿Eso te llevaría a desestimar?