bashスクリプトは、最初の引数を入力として読み込み、別のファイルで1行ずつ変数を検索します。

bashスクリプトは、最初の引数を入力として読み込み、別のファイルで1行ずつ変数を検索します。

変数A1、A2、A3、θ、θ1、およびθ2を含む「input.txt」ファイルがあります。 input.txt の例は次のとおりです。

$ cat input1.txt 

A1=5.2 A2=4.9  A3=6.1 θ=space    θ1=2.5 θ2=1.2 

A1=3.1 A2=5.1  A3=3.7 θ=triangle θ1=8.1 θ2=3.9

input.txtファイルを実行するスクリプトを作成したいと思います。ファイルは2番目のパラメータとして渡され、1番目のパラメータはtheta値になります。

以下のようにスクリプトを作成しました。

#! /bin/bash

file=input1.txt

if grep -q $1 "$file"; 
then
awk -F '[= ]+' '{ print $12 }' <$2

else

echo "Not available"
fi
}

しかし、このスクリプトを次のように実行すると:

./script space input.txt   

(最初のパラメータはθの値、2番目のパラメータはファイル名です。)出力はフィールド12のすべての値です。

$ ./script1 space input1.txt 
1.2
3.9

出力は1.2でなければなりません。検索した結果、ファイルを1行ずつ読み取るにはループを作成する必要がありますが、機能しないことがわかりました。

答え1

次のアドレスからすべての作業を完了できますawk

#!/bin/sh
file=$2

awk -v theta="$1" -F '[= ]+' '
        $0 ~ theta { print $12; found++ }
        END        { if (!found) { print "Not available"; exit 1 } }' "$file"

$2両方のコマンドライン引数が存在し、読み取り可能なファイル名であることを確認するには、エラー処理を追加する必要があります。

  • ファイルを読み取れない場合は、$2エラーメッセージが表示されます。awk
  • 空またはなしの場合は、$2標準 awk入力を自動的に読み込みます。

(もちろん、これらの行動のいずれかまたは両方に問題がない可能性があります。)

メモ:

  • $0 ~ thetaに変更すると、より正確な結果が得られます$8 == theta
  • の変数はawk空白で初期化されます。これは数学的文脈ではゼロとして扱われるため、found++最初の実行では1に設定されます。found意図的にこう言うのです。found++代わりに、found = 1複数の行が一致する場合、theta値は found次のように設定されます。数字そんなライン。これはエラー条件のようです。懸念がある場合は、END1以外の場合はエラーを報告するようにブロックを修正できます。found
  • もちろん、値を見つけたときに1つのアクションを実行し、値が見つからないときに別のアクションを実行するスクリプトが必要な場合は、ブロックからそのステートメントを削除し、スクリプトが終了ステータスをテストし、print独自のエラーメッセージをエクスポートすることができます。 。 。出力(例:theta2値)をキャプチャしたい場合でも、同じことを行う必要があります。逆に、人間が読めるエラーメッセージだけが必要で終了ステータスを確認する必要がない場合は、ブロックからステートメントを削除できます。ENDawkawkexitEND

答え2

この試み:

#! /bin/bash

file=input1.txt

if grep -q $1 "$file";
then
        grep $1 $2 | awk -F '[= ]+' '{ print $12 }'
else
        echo "Not available"
fi

答え3

あなたのロジックは次のように要約されます。

grep -om1 "$1" < "$2" ||
echo 'Not available.'

grep...とにかくGNUが提供されます。だが私ならあきらめたりecho、少なくとも…。

! echo 'Not available.' >&2

...代わりに。

関連情報