次の2つの入力ファイルがあるとしましょう。
> file1
2
3
4
> file2
10
100
1000
計算したい:各行に対してfile1 / file2、結果はfile3です。
> file 3
0.2
0.03
0.004
Bashの分割は次のように達成できます。$((file1_line/file2_line))
答え1
Apaste
とAの組み合わせはbc
単純な算術のための良い選択です。
paste -d/ file1 file2 | bc -l
出力:
.2000000000
.0300000000
.0040000000
もう少し進化した例
いくつかのトリックを使用すると、より洗練されます。以下を含むとしますfile3
。
6
7
8
次のことができます(file1 + file3) / file2
。
paste -d'(+)/' /dev/null file1 file3 /dev/null file2
出力:
(2+6)/10
(3+7)/100
(4+8)/1000
paste
これは、ループが各行の区切り文字のリストを繰り返すために機能します。
0で割る反応
誤ったジョブが送信されると、bc
警告は標準エラーとして送信されます。これを別のファイルにリダイレクトし、その内容に基づいてプログラムフローを決定できます。たとえば、次のようになります。
paste -d/ file1 file2 | bc -l > resultfile 2> errorfile
if grep -q 'Divide by zero' errorfile; then
echo "Error in calculation"
else
echo "All is well"
fi
またはエラーがある場合:
paste -d/ file1 file2 | bc -l > resultfile 2> errorfile
if ! file errorfile | grep -q empty; then
echo "Error in calculation"
else
echo "All is well"
fi
答え2
から始まる
paste file1 file2 | awk '{printf "%f\n",$1/$2 } '
どこ
paste
ファイル「マージ」awk
分割は一度に 1 つずつ計算されます。
末尾のゼロが多すぎるのが気に入らない場合は、追加してください。
... | sed -e s/0*\$//
次の場合は終了0
paste file1 file2 | awk '!$2 {exit ; } {printf "%f\n",$1/$2 } '