次のテキストファイルがあります。
1923.12.312. Nikl
12391.123.123 Jo
12398123.123912 Ad
1923.12.312.
variable1
このファイルを繰り返してmakeを実行し、Nikl
variable2
echoコマンドで使用しようとします。その後、続行してこれらの背中を作り、エコーする必要が12391.123.123
variable1
あります。Jo
variable2
これが私がこれまでにしたことです:
while read p
do
variable1="$(awk '{print $1}')"
variable2="$(awk '{print $2}')"
echo "if [ \"\$STATUS\" == \"$variable1\" ]
then
vem=\"$variable2\"
fi"
done saker.txt
次のように出力する必要があります。
if [ "$STATUS" == "1923.12.312." ]
then
vem="NIKL"
fi
ちょっと待ってください。しかし、そうではありません。代わりに、これが出力です。
awk: cmd. line:1: {print $2)
awk: cmd. line:1: ^ syntax error
if [ "STATUS" == "12391.123.123
12398123.123912" ]
then
vem=""
fi
また、変数を削除して次のことを試しました。
while read p
do
echo "if [ \"\$STATUS\" == \"`awk '{print $1}'`\" ]
then
vem=\"`awk '{print $2}'`\"
fi"
done saker.txt
しかし、それは同じ結果をもたらしました。
答え1
シェルを使う
行を変数に分割する読み取り機能を使用すると簡単です。
while read var1 var2
do
echo "if [ \"\$status\" == \"$var1\" ]
then
vem=\"$var2\"
fi"
done <saker.txt
これで以下が生成されます。
if [ "$status" == "1923.12.312." ]
then
vem="Nikl"
fi
if [ "$status" == "12391.123.123" ]
then
vem="Jo"
fi
if [ "$status" == "12398123.123912" ]
then
vem="Ad"
fi
awkを使用してください:
この awk コマンドは単一のprintf
コマンドを使用します。
$ awk '{printf "if [ \"$status\" == \"%s\" ]\nthen\nvem=\"%s\"\nfi\n",$1,$2}' saker.txt
if [ "$status" == "1923.12.312." ]
then
vem="Nikl"
fi
if [ "$status" == "12391.123.123" ]
then
vem="Jo"
fi
if [ "$status" == "12398123.123912" ]
then
vem="Ad"
fi
答え2
私はスクリプトをまったく更新するためにスクリプトを実行してはいけないと強く思います。代わりに、awk
元のスクリプトから呼び出して必要なデータを取得する必要があります。その後、このsaker.txt
ファイルをスクリプトの作成スクリプトの出力を変更するために使用するのではなく、スクリプトの動作を変更するための設定ファイルとして使用できます。
saker.txt
明らかに、あなたのスクリプトには非常に限られたデータがありますが、ルックアップテーブルを使用してスクリプトに変数を設定しているようです。
特にスクリプトの断片は次のとおりです。
if [ "$STATUS" == "1923.12.312." ]
then
vem="Nikl"
fi
if [ "$STATUS" == "12391.123.123" ]
then
vem="Jo"
fi
if [ "$STATUS" == "12398123.123912" ]
then
vem="Ad"
fi
機能の複製は、次のようにインラインawkスクリプトを使用して実行できます。
vem=$( awk -v status="$STATUS" '$1 == status { printf "%s", $2 ; exit }' saker.txt )
bash
これは、「ファイル内の他の変数の値を見つけることに基づいて変数をどのように設定しますか?」という質問に対する答えです。これは、スクリプトを更新するためにスクリプトを実行して実行したい操作のようです。
もちろん、「$STATUS
の値がまったく表示されない場合はどうなりますか?」、saker.txt
「2回表示された場合はどうなりますか?」、「デフォルトはどのように設定されますかvem
?」などの注意事項もあります。これらすべての問題とスクリプトの更新スクリプトがあります。
vem
編集:ファイルで指定された値にスペースを許可するには、タブなどの他saker.txt
のものを区切り文字として使用することをお勧めします。
$ cat saker.txt
1923.12.312. Nikl
12391.123.123 Jo
12398123.123912 Ad
次に、次のバージョンのawk
シングルライナーを使用します。
vem=$( awk -Ft -v status="$STATUS" '$1 == status { printf "%s", $2 ; exit }' saker.txt )
タブ区切り記号に関する警告:使用しないでください。1つ以上ブランド。基本的な「スペースで区切られた」処理とはawk
異なり各タブ文字は、間にテキストがあるかどうかに関係なく、区切り文字として扱われます。したがって、10000<tab><tab>John
「10000」、「」(空のフィールド)、および「John」の3つのフィールドが考慮されます。