Behalten Sie nur wenige Ziffern des Dezimalteils

Behalten Sie nur wenige Ziffern des Dezimalteils

Ich habe eine Datei, deren Inhalt so aussieht.

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

CSV mit vier Spalten, deren dritte und letzte Spalte Floats sind.

Ich möchte den gesamten Teil der Zahlen (einschließlich des Vorzeichens) entfernen und nur die ersten drei Ziffern des Dezimalteils behalten, so dass das obige Beispiel wie folgt aussieht:

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

Wie kann ich das machen?

Antwort1

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

Dies sucht nach Zeichenfolgen, die mit einem optionalen Zeichen beginnen, -gefolgt von einer beliebigen Anzahl von Ziffern, gefolgt von einem Punkt, gefolgt von einer beliebigen Anzahl von Ziffern, aus denen die ersten drei ausgewählt werden.

Eine andere Möglichkeit besteht darin, [0-9]durch [[:digit:]]as zu ersetzen.

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

Antwort2

Verwendung von awk:

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

Wobei die Werte auf Komma und Punkt -Fgesetzt werdenFS,.

substrdruckt die 3 erforderlichen Ziffern nach dem Punkt.

Antwort3

awk? Warum nicht 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=',')

Antwort4

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

verwandte Informationen