1

私は bash シェル スクリプトを初めて使用するので、このタスクを実行できるスクリプトの提案に感謝します。多くの行を含むファイル (list.cqt) があります。各行には、次の形式の「/」で区切られたフィールドのリストがあります: /Field1/Field2/Field3/Field4/Field5/Field6/Field7/Field8/Field9/Field10

たとえば、list.cqt の内容は次のとおりです: /
F11/F12/F13/F14/F15/F16/F17/F18/F19/F110 ... /Fx1/Fx2/Fx3/Fx4/Fx5/Fx6/Fx7/Fx8/Fx9/Fx10


(問題を単純化するために、各フィールド内の名前を変更しました。フィールドの数だけが各行で一定です。各フィールドの内容は、数字、文字など、何でもかまいません)

list.cqt から各行を読み取って、次のコマンドを実行するスクリプトを作成する必要があります。
command arg1 arg2 arg3 arg4 *arg5* arg6 arg7 arg8 arg9 arg10

arg4、 arg5 、arg7、およびarg10のみが、読み取られる行ごとに変更されます。残りはすべて同じままです。
arg4は list.cqt のその行の Field4 です
arg5は list.cqt のその行の Field6 です
arg7は基本的に最初のコマンドで -1000 から始まり、100 ずつ変化します。したがって、2 番目のコマンドでは、2 番目のコマンドでは -900 になります。など、11 番目のコマンドでは 0、12 番目のコマンドでは 100、13 番目のコマンドでは 200 など
です。arg10はarg7と同じ絶対値ですが、符号が反対です。したがって、arg7が -600 の場合、arg10は 600です。arg7が 400 の場合、arg10-400 です。

たとえば、上記のファイルの例で list.cqt から最初の 2 行を読み取ると、コマンドは次のようになり
ます

ありがとうございました!

4

2 に答える 2

3

readInternal Field Separator を使用して、シェルのコマンドの区切り文字を制御できますIFS。配列に読み込むと、インデックス付きの値に簡単にアクセスできます。次に、入力をループしてカウンター変数を更新するだけです。引数を配列に保存すると、展開された配列を引数としてコマンドに渡すことができます。

#!/bin/bash

# Use set -x to see if the array "args" is getting assigned the values you expect.
IFS='/'
counter=-1000
while read -a fields; do
    (( counter+=100 ))
    args=(
        'arg1' 'arg2' 'arg3'
        "${fields[4]}" "${fields[6]}" 'arg6'
        $counter 'arg8' 'arg9' $(( -1 * counter ))
    )
    # command "${args[@]}"
done < list.cqt
于 2012-07-13T19:14:21.513 に答える
2

echo生成されたリストが正しいかどうかを確認する方がよいため、コマンドの前に追加しました。

arg7=-1000
arg10=1000
while read line
do
  set $(echo $line | tr / ' ')
  echo command arg1 arg2 arg3 "$4" "$6" arg6 "$arg7" arg8 arg9 "$arg10"
  arg10=$((arg10-100))
  arg7=$((arg7+100))
done < list.cqt

存在する場合は、echoスクリプトを削除して実行してください。

ここでは、行ごとに処理list.cqtし、その行の一部をシェルの位置引数に設定します。次に、このパーツを$4およびとして使用します$6。変数arg10とは、ファイルarg7の行が処理されるたびに増減します。list.cqt

アップデート

位置引数の代わりに配列を使用することもできます (ヒントを提供してくれた Dennis Williamson と kojiro に感謝します)。

arg7=-1000
arg10=1000
while IFS=/ read line
do
  echo command arg1 arg2 arg3 "${line[4]}" "${line[6]}" arg6 "$arg7" arg8 arg9 "$arg10"
  arg10=$((arg10-100))
  arg7=$((arg7+100))
done < list.cqt

これにより、コードが少し速くなり、きれいになります。

于 2012-07-13T19:08:06.843 に答える