変数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
次のように設定されます。数字そんなライン。これはエラー条件のようです。懸念がある場合は、END
1以外の場合はエラーを報告するようにブロックを修正できます。found
- もちろん、値を見つけたときに1つのアクションを実行し、値が見つからないときに別のアクションを実行するスクリプトが必要な場合は、ブロックからそのステートメントを削除し、スクリプトが終了ステータスをテストし、
print
独自のエラーメッセージをエクスポートすることができます。 。 。出力(例:theta2値)をキャプチャしたい場合でも、同じことを行う必要があります。逆に、人間が読めるエラーメッセージだけが必要で終了ステータスを確認する必要がない場合は、ブロックからステートメントを削除できます。END
awk
awk
exit
END
答え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
...代わりに。