내용이 다음과 같은 파일이 있습니다.
2,0,-1.8433679676403103,0.001474487996447893
3,1,0.873903837905657,0.6927701848899038
1,1,-1.700947426133768,1.5546514434152598
세 번째와 마지막 열이 부동 소수점인 4개의 열이 있는 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
-
이는 옵션으로 시작하는 문자열 과 임의의 숫자, 마침표, 그 뒤에 임의의 숫자가 오는 문자열을 찾고 그 중에서 처음 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
어? 왜 파이썬이 아닌가?
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