小数点以下の桁数だけ残す

小数点以下の桁数だけ残す

次のような内容のファイルがあります。

2,0,-1.8433679676403103,0.001474487996447893
3,1,0.873903837905657,0.6927701848899038
1,1,-1.700947426133768,1.5546514434152598

4 つの列を持つ CSV。3 列目と最後の列は浮動小数点数です。

数字の整数部分(符号を含む)を取り除き、小数点部分の最初の3桁だけを残したいので、上記のサンプルは次のようになります。

2,0,843,001
3,1,873,692
1,1,700,554

これどうやってするの?

答え1

sed 's/-\{,1\}[0-9]*\.\([0-9]\{,3\}\)[0-9]*/\1/g' file

これは、オプションで始まり-、その後に任意の数の数字、ピリオド、その後に任意の数の数字が続き、その中から最初の 3 つが選択されるような文字列を検索します。

もう一つの方法は、次のよう[0-9]に置き換えることです。[[:digit:]]

sed 's/-\{,1\}[[:digit:]]*\.\([[:digit:]]\{,3\}\)[[:digit:]]*/\1/g' file

答え2

使用方法awk:

awk -F[,.] '{print $1","$2","substr($4,1,3)","substr($6,1,3)}' file

値をコンマとドットに-F設定する場合に使用する場所FS,.

substrドットの後に必要な 3 桁の数字を出力します。

答え3

awk? なぜPythonではないのですか?

import csv
filename = <yourfilenamehere>

for line in list(csv.reader(open(filename, 'r'))):
    extra = [str(int((abs(float(num)) % 1) * 1000)).zfill(3) for num in line[2:]]
    print(*(line[:2] + extra), sep=',')

答え4

$ perl -lne 'print join " ", /\.\K(...)/g' file

関連情報