Linux/Unix Shell Scripting - Pipes a fichero >

 
Vista:

Pipes a fichero >

Publicado por iGNASI85 (5 intervenciones) el 07/12/2006 19:33:23
Buenas, tengo unas dudillas; me explico:

Tengo 4 ficheros, cada uno de ellos contiene 10 sudokus. la estructura de los ficheros es:

# Sudoku Easy: #1 (37) [02/12/2006]
-1 -1 5 7 -1 -1 0 3 -1
2 -1 1 6 -1 -1 4 -1 -1
-1 -1 8 -1 1 -1 6 -1 2
-1 2 -1 -1 6 -1 -1 1 0
-1 1 -1 -1 -1 8 3 2 -1
-1 -1 -1 4 -1 1 -1 7 6
1 8 0 -1 3 -1 -1 -1 5
3 5 4 -1 -1 7 -1 -1 -1
7 -1 -1 8 4 5 -1 -1 -1
# Sudoku Easy: #2 (36) [02/12/2006]
...
.
.
.

Y así sucedivamente para los 10 sudokus que hay en los 4 ficheros llamados: Easy-1.asc, Easy-2.asc, Easy-3.asc y Easy-4.asc

Bien, necesito que se resuelvan estos 10 sudokus de los 4 ficheros (40 sudokus en total). Para ello ya tengo un script que lo hace; ahora tengo que crear un archivo de resultados para procesarlos posteriormente con AWK.

Por eso tengo que insertar en un fichero denominado resultados, la cabecera del sudoku que se trata; i.e # Sudoku Easy: #1 (37) [02/12/2006] y luego debajo de esta cabecera el resultado del solver del sudoku.... para ello he hecho este bucle:

for NUM in 1 2 3 4
do
cat Easy-$NUM.asc | grep Sudoku > avore
echo "SUDOKU: $NUM"
for EX in 1 2 3 4 5 6 7 8 9 10
do
cat avore | sed -n '1p' >> resultats
cat avore | sed -e '1d' >> avore
./part2.pl Easy-$NUM.asc $EX -x 8 >> resultats
done
done

Donde hago un recorrido de los 10 sudokus para los 4 ficheros que los contienen.

El primer cat copia todas las cabeceras del sudoku a un fichero denominado avore
Entonces entro dentro del bucle de los ejercicios, lo que hago es copiar la primera línea del fichero anterior al fichero de resultados, entonces borro esta línia (al estilo pila) para que en la primera línia haya la cabecera del 2º sudoku; resuelvo el sudoku y lo copio al fichero resultados.

Mi problema es que en el fichero resultados solo hay la primera cabecera de cada fichero de ejercicios y debajo de ellas los resultados de los 10 sudokus de cada fichero.

Mediante una ejecución al estilo debuggin, es decir, con echo y cats del fichero avore he descubierto que el problema se encuentra en:

cat avore | sed -e '1d' >> avore

y es que en vez de copiar el fichero avore anterior menos la primera línia (que lo hace correctamente si lo ejecuto en la consola), lo que hace es borrarlo o dejarlo en blanco.

Alguna idea de porque se produce este problema? Alguna solución?

Muchas gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Pipes a fichero >

Publicado por iGNASI85 (5 intervenciones) el 08/12/2006 00:32:41
Solucioné el problema con la inclusión de un fichero auxliar, me quedó el bucle así:

for NUM in 1 2 3 4
do
cat Easy-$NUM.asc | grep Sudoku > avore
echo "SUDOKU: $NUM"
for EX in 1 2 3 4 5 6 7 8 9 10
do
echo "EXERCICI: $EX"
cat avore | sed -n '1p' >> resultats
cat avore | sed -e '1d' > aux
cat aux > avore
./part2.pl Easy-$NUM.asc $EX -x 8 >> resultats
done
done
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Pipes a fichero >

Publicado por Tom (3 intervenciones) el 08/12/2006 16:41:23
Se entiende fatal lo que quieres hacer, de hecho no me entero ni siquiera viendo la solución que has encontrado.

Tu problema con la línea "cat avore | sed -e '1d' >> avore" no puede ser el que comentas. Esa línea lo que hace es añadir (>>) al fichero avore todas las líneas que ya tenía, menos la primera (o sea que queda casi con el doble de líneas que antes).

Yo haría algo así:

>resultats
for FILE in Easy-[1-4].asc
do
grep Sudoku $FILE | while read SUDOKU
do
EX=$(expr "$SUDOKU" : '# Sudoku Easy: #\([0-9]*\).*')
echo $SUDOKU
./part2.pl $FILE $EX -x 8
done >> resultats
done
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Pipes a fichero >

Publicado por iGNASI85 (5 intervenciones) el 09/12/2006 16:19:12
Gracias Tom por tu interés y paciencia en el asuntoy perdona mi poca expresividad.

Tendré en cuenta tu solución, peró en la solución que yo presenté, después de eliminar la línia con sed lo redirecciono hacia el fihcero avore con '>' y no con '>>' con lo que en este fichero cada vez se elimina una línea y por lo tanto me permite hacer lo que quiero.

Comentar que probaré tu aportación, que seguramente es = d eficaz y mas elegante que la mía.

Grcasi de nuevo!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Pipes a fichero >

Publicado por Tom (361 intervenciones) el 11/12/2006 12:01:57
Cuando el shell interpreta, y comienza a ejecutar, una línea de comando como
cat pepe > pepe
, lo primero que debe hacer es crear o truncar el fichero pepe, para pasarle el nuevo descriptor de fichero al comando cat. Como ya has visto, esto produce resultados inesperados pero si lo piensas bien, verás que es totalmente lógico.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar