bash - primera - shell script linux español
Bash: lee un archivo línea por línea y procesa cada segmento como parámetros para otro programa (3)
Tengo un trabajo sucio que hacer, por lo que un guión de Bash parece ser una buena opción. Soy nuevo en Bash, y la experiencia me frustra.
El archivo mapfiles.txt consiste en líneas como sigue. Cada línea tiene cuatro segmentos separados por un espacio en blanco. Cada segmento representa un parámetro de entrada para un nombre de programa externo ''prog''. Por ejemplo, "cm19_1.png" es el nombre del archivo , "0001" el índice , "121422481" la longitud y "31035995" la latitud .
Archivo: mapfiles.txt
cm19_1.png 0001 121422481 31035995
cm19_2.png 0002 121423224 31035995
cm19_3.png 0003 121423967 31035995
…
Quiero ejecutar comandos similares para cada línea. Como se muestra a continuación, el orden de los parámetros de entrada del programa es ligeramente diferente. Entonces tiene sentido escribir un script bash para manejar el trabajo repetido.
[Usage] prog <index> <longitude> <latitude> <filename>
example: prog 0001 121422481 31035995 cm19_1.png
Generalmente, el script bash operará de esta manera:
- Lee una línea de mapfiles.txt
- Dividir los segmentos
- Llame al programa con un orden de parámetro correcto
Aquí viene run.sh.
#!/bin/sh
input=mapfiles.txt
cmd=prog
while read line
do
file=$(echo $line | cut -d'' '' -f1)
key=$(echo $line | cut -d'' '' -f2)
log=$(echo $line | cut -d'' '' -f3)
lat=$(echo $line | cut -d'' '' -f4)
echo $cmd $key $log $lat $file
done < "$input"
Lo que esperaba es
prog 0001 121422481 31035995 cm19_1.png
prog 0002 121423224 31035995 cm19_2.png
prog 0003 121423967 31035995 cm19_3.png
…
El resultado REAL que obtuve es
cm19_1.png21422481 31035995
cm19_2.png21423224 31035995
cm19_3.png21423967 31035995
Problemas que me confundieron
- ¿Dónde está ''prog''?
- ¿Dónde está el espacio en blanco?
- ¿Qué pasa con el orden de los parámetros?
Hmm ... Escribí este script en mi Mac usando vim y lo copié en un cuadro Scientific Linux y un cuadro gentoo. Estos tres chicos obtienen los mismos resultados ridículos.
Puedes simplificar esto mucho:
while read file key log lat
do
echo "$cmd" "$key" "$log" "$lat" "$file"
done < "$input"
Usando GNU Parallel puedes hacerlo en una sola línea + lo haces en paralelo gratis:
cat mapfile.txt | parallel --colsep ''/s'' prog {2} {3} {4} {1}
Mire los videos introductorios para obtener más información: http://www.youtube.com/watch?v=OpaiGYxkSuQ
prog
podría haber desaparecido porque $cmd
no se exporta. Su versión de / bin / sh podría ejecutar la instrucción while
en un shell separado. Este no debería ser el caso, y este no es el caso para mi instalación de bash, pero quizás el suyo se comporte de maneras interesantes en este departamento.
UPD Veo que tiene varias cajas que dan los mismos resultados. Esto hace que la teoría de la subcadena sea poco probable. Quizás tengas algunos personajes divertidos en tu script y / o archivo fuente.
He copiado y pegado su script y su archivo fuente en mi caja de gentoo y arroja los resultados esperados. Tal vez deberías hacer lo mismo y comparar los archivos con los originales.