ファイルを繰り返し、各単語を変数として作成しますか?

ファイルを繰り返し、各単語を変数として作成しますか?

次のテキストファイルがあります。

1923.12.312. Nikl
12391.123.123 Jo
12398123.123912 Ad

1923.12.312. variable1このファイルを繰り返してmakeを実行し、Nikl variable2echoコマンドで使用しようとします。その後、続行してこれらの背中を作り、エコーする必要が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つのフィールドが考慮されます。

関連情報