Bash: построчно прочитайте файл и обработайте каждый сегмент в качестве параметров для другой программы.

У меня есть некоторая грязная работа, поэтому сценарий Bash кажется хорошим выбором. Я новичок в Bash, и этот опыт меня разочаровывает.

Файл mapfiles.txt состоит из следующих строк. Каждая линия состоит из четырех сегментов, разделенных пробелом. Каждый сегмент представляет собой входной параметр для внешней программы с именем «prog». Например, cm19_1.png - это имя файла , «0001» - индекс , «121422481» - долгота , а «31035995» - широта .

Файл: mapfiles.txt

cm19_1.png 0001 121422481 31035995
cm19_2.png 0002 121423224 31035995
cm19_3.png 0003 121423967 31035995
…

Я хочу выполнить аналогичные команды для каждой строки. Как показано ниже, порядок входных параметров программы немного отличается. Поэтому имеет смысл написать сценарий bash для обработки повторяющейся работы.

[Usage] prog <index> <longitude> <latitude> <filename>
example: prog 0001 121422481 31035995 cm19_1.png

Обычно сценарий bash работает следующим образом:

  1. Прочитать одну строку из mapfiles.txt
  2. Разделить сегменты
  3. Вызвать программу с правильным порядком параметров

Здесь идет 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"

Я ожидал

prog 0001 121422481 31035995 cm19_1.png
prog 0002 121423224 31035995 cm19_2.png
prog 0003 121423967 31035995 cm19_3.png
… 

АКТУАЛЬНЫЙ результат, который я получил:

 cm19_1.png21422481 31035995
 cm19_2.png21423224 31035995
 cm19_3.png21423967 31035995

Проблемы, которые меня сбили с толку

  1. Где «prog»?
  2. Где пробел?
  3. Что не так с порядком параметров?

Хм… Я написал этот сценарий на своем Mac с помощью vim и скопировал его в ящик Scientific Linux и ящик gentoo. Эти три парня получают одинаковые нелепые результаты.

36
задан Nakilon 17 August 2013 в 22:19
поделиться