Lectura de dos files en un bucle IFS while – ¿Hay alguna forma de get un resultado diff cero en este caso?

Tengo un file de text lleno de cientos de líneas de secuencias como esta:


     b 29.
     b 52.
     c 84.
     c 83.
     c 94.
     c 93.
     c 61.
     b 38.
     c 81.
     c 92.
     c 28.
     c 37.
     c 27.

     lara @ batcuter: ~ / .asd / a-new-way-of-studying-go $ wc -l game7
     271 juego7

y el siguiente script, que separa un file de text en dos files, uno de los cuales consiste en líneas impares y una de las cuales consiste en líneas pares, luego lee ambos files en un ciclo IFS while, imprimiendo una línea de cada uno en un momento:

#/bin/bash #testing liquor-where-twin-twas-born awk '{print>"line-"NR%2}' $@ while IFS= read -r lineA && IFS= read -r lineB <&3; do echo "$lineA"; echo "$lineB" done <line-1 3<line-0 

que desafortunadamente da algo no exactamente igual al file de input, debido al hecho de que un file era una línea más larga que la otra.


     lara @ batcuter: ~ / .asd / a-new-way-of-studying-go $ testing-licor game7> testing
     lara @ batcuter: ~ / .asd / a-new-way-of-studying-go $ diff test game7
     270a271
     > b 7.

Obviamente, dado que el file tiene 271 líneas de longitud, dividirlo por la mitad produce dos files, uno de los cuales es 136 líneas, y uno de los cuales es 135 líneas. Necesito arreglar el IFS while loop para devolver cero diferencias. Al principio, pensé en usar read ... || read ... read ... || read ... ayudaría. Pero, en realidad, eso simplemente infló la salida, insertando más de una línea nueva entre cada input, y raspando la última línea (la línea que terminó en el file con el número impar de líneas), como lo hicieron todas las otras soluciones que intentó.

Dile a la persona que sugirió || que es un idiota Usando || hace que el fragment lea todas las líneas del fileA primero, luego todas las líneas del fileB , porque mientras la línea de read lineA verdadera, read lineB no se ejecuta. En cambio, llame a las dos veces, guarde el estado de devolución y luego pruebe los estados de devolución.

 while IFS= read -r lineA; statusA=$? IFS= read -r lineB; statusB=$? [ $statusA -eq 0 ] || [ $statusB -eq 0 ] do … 

Puede continuar probando $statusA y $statusB dentro del ciclo si necesita saber si un file se ha agotado (el contenido de la línea estará vacío, pero esto no se puede distinguir de una línea vacía).