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 readbucles, 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
pasteune 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
pastepodría coincidir con una línea en blanco de un archivo con una línea no en blanco de otro archivo. Puede usargreppara 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
grepcomo 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
readpero salte las líneas en blanco. Esta función puede funcionar llamandoreada 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
-uopción de lecturaUn enfoque sería usar en
read -ralugar de soloread. Suponiendo que lasfilestoCompare.txtcontenidas 2 columnas con los nombres de los archivos en cada uno, laread -raleerí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 delwhilebucle.Ejemplo
Digamos que tengo este archivo:
filestoCompare.txty 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
pastecomando de la siguiente manera:Aquí está el contenido de list1and2:
fuente
joinellos primero.pastepara unir los 2 archivos? ¿Eso te llevaría a desestimar?