scripts script primera para manejo linea leer fichero español ejemplos comando cadenas archivo bash parameters line-by-line

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:

  1. Lee una línea de mapfiles.txt
  2. Dividir los segmentos
  3. 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

  1. ¿Dónde está ''prog''?
  2. ¿Dónde está el espacio en blanco?
  3. ¿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.