Оставьте только несколько цифр десятичной части.

Оставьте только несколько цифр десятичной части.

У меня есть файл, содержимое которого выглядит следующим образом.

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

CSV с четырьмя столбцами, третий и последний из которых являются числами с плавающей точкой.

Я хочу избавиться от всей части цифр (включая знак) и оставить только три первых цифры десятичной части, чтобы приведенный выше пример стал

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

Он ищет строки, начинающиеся с необязательного символа, -за которым следует любое количество цифр, за которыми следует точка, за которой следует любое количество цифр, из которых будут выбраны первые три.

Другой способ — заменить [0-9]на [[:digit:]]as

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

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

Связанный контент