
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 -F
gesetzt werdenFS
,
.
substr
druckt 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