web-dev-qa-db-ja.com

bashで数値を計算して切り上げます

最初のフィールドを取得して計算する方法 および シェルの浮動小数点数を丸める方法 のわずかな変化に苦労しています。

(列間のスペース)のようなファイルがあります:

1533 C_P.doc
691 C_M.doc
905 G_S.doc
945 J_Z.doc
1549 J_M.doc
1701 L_B.doc

数値の列を取得し、各数値を65で除算し(ただし切り上げ)、これらの数値を含む新しい列(理想的には左側)を追加します。つまり.

24 1533 C_P.doc
11 691 C_M.doc
14 905 G_S.doc
15 945 J_Z.doc
24 1549 J_M.doc
27 1701 L_B.doc

これをbashスクリプトでお願いします。出来ますか?必要に応じて、中央の列を簡単に削除できます。

[Ubuntu 14.04]

3
ugm6hr

awkを介して、中央の列を保持します。

_awk '{printf("%.f ", ($1/65)+0.5)}1' infile > outfile
24 1533 C_P.doc
11 691 C_M.doc
14 905 G_S.doc
15 945 J_Z.doc
24 1549 J_M.doc
27 1701 L_B.doc
_

awkを介して、中央の列なし:

_awk '{printf("%.f", ($1/65)+0.5); $1=""}1' infile > outfile
24 C_P.doc
11 C_M.doc
14 G_S.doc
15 J_Z.doc
24 J_M.doc
27 L_B.doc
_

_+0.5_はceil()関数の代わりに使用され、次の数値に切り上げられることに注意してください。そして最後の_1_はデフォルトの印刷をアクティブにします。

2
αғsнιη

Perlを使用できます:

$ Perl -MPOSIX=ceil -anle '$F[0] = ceil($F[0]/65);print "@F"' file
24 C_P.doc
11 C_M.doc
14 G_S.doc
15 J_Z.doc
24 J_M.doc
27 L_B.doc
1
cuonglm

Shellでpythonを使用し、_a.txt_がファイルであると想定してもかまわない場合:

_[sreeraj@server ~]$ cat a.txt
1533 C_P.doc
691 C_M.doc
905 G_S.doc
945 J_Z.doc
1549 J_M.doc
1701 L_B.doc
[sreeraj@server ~]$ for i in $(awk -v c=65 '{ print $1/c }' a.txt) ; do python -c 'print int(round('$i',0))' ; done >> b.txt
[sreeraj@server ~]$ paste b.txt a.txt > c.txt
[sreeraj@server ~]$ cat c.txt
24      1533 C_P.doc
11      691 C_M.doc
14      905 G_S.doc
15      945 J_Z.doc
24      1549 J_M.doc
26      1701 L_B.doc
[sreeraj@server ~]$
_

これにより、目的の出力を持つファイルc.txtが作成されます。

使い方:

awkを使用してa.txtの最初の列の値を65で除算し、次にpythonの組み込み関数round()を使用して小数を丸めます。次に、「for」ループからの出力を使用してファイルc.txtを作成し、pasteを使用してc.txtとa.txtを結合します。

0
Sree