38

やらなければならない汚い仕事があるので、Bashスクリプトは良い選択のようです。私はBashを初めて使用しますが、その経験は私を少し苛立たせます。

ファイルmapfiles.txtは、次の行で構成されています。各行には、空白で区切られた4つのセグメントがあります。各セグメントは、外部プログラム名「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
…

各行に同様のコマンドを実行したい。以下に示すように、progの入力パラメーターの順序は少し異なります。したがって、繰り返される作業を処理するためにbashスクリプトを作成することは理にかなっています。

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

通常、bashスクリプトは次のように動作します。

  1. mapfiles.txtから1行を読み取ります
  2. セグメントを分割する
  3. 正しいパラメータ順序でprogを呼び出します

これが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を使用して作成し、ScientificLinuxボックスとgentooボックスにコピーしました。これらの3人は同じばかげた出力を取得します。

4

3 に答える 3

52

これを大幅に簡略化できます。

while read file key log lat
do
  echo "$cmd" "$key" "$log" "$lat" "$file"
done < "$input"
于 2011-10-01T09:47:26.947 に答える
10

GNU Parallelを使用すると、1行で実行でき、+無料で並列実行できます。

cat mapfile.txt | parallel --colsep '\s' prog {2} {3} {4} {1}

詳細については、紹介ビデオをご覧ください:http ://www.youtube.com/watch?v=OpaiGYxkSuQ

于 2011-10-02T23:11:55.790 に答える
2

prog$cmdエクスポートされていないため、消えた可能性があります。ご使用のバージョンの/bin/ shはwhile、別のシェルでステートメントを実行する場合があります。これは当てはまらないはずであり、これは私のbashのインストールには当てはまりませんが、おそらくあなたはこの部門で興味深い方法で動作します。

UPD同じ結果をもたらすボックスがいくつかあるようです。これにより、サブシェル理論はありそうにありません。スクリプトやソースファイルに面白いキャラクターが含まれている可能性があります。

スクリプトとソースファイルをコピーしてgentooボックスに貼り付けましたが、期待どおりの結果が得られます。おそらく、同じことをして、ファイルを元のファイルと比較する必要があります。

于 2011-10-01T09:58:01.623 に答える