디렉토리에 여러 개의 "ascii" 테이블이 있는데, 그 중 일부는 소수로 표시되는 숫자를 갖고 있고 일부는 다음과 같이 부동소수점으로 표시되는 숫자를 가지고 있습니다.
1 1 1423
1 2 1589
1 3 0.85e 5
1 4 0.89e 4
1 5 8796
...
테이블의 모든 값을 십진수로 변환하는 방법이 있나요? 편집기를 사용하면 효과가 있다고 들었지만 tr
변환 작업 방법을 모르겠습니다.
답변1
이 sed
스크립트는 "e" 뒤의 공백을 제거하고 awk
각 필드만 인쇄합니다($3에 1을 곱하면 fp가 아닌 십진수로 "변환"됩니다).
$ sed -e 's/e /e/g' file | awk '{print $1, $2, $3 * 1}'
1 1 1423
1 2 1589
1 3 85000
1 4 8900
1 5 8796
이는 파일의 부동 소수점 숫자를 가정합니다.
- "e" 뒤에 추가 공백이 있습니다.
- 양수 지수의 경우 "+"를 생략합니다.
- 매우 큰 지수는 없습니다. 그렇지 않으면
awk
fp로 인쇄됩니다.
awk
's/e /e/' 변환이 가능 sed
하지만(그래서 필요하지 않음) 너무 늦어서 뇌가 피곤해졌습니다. sed | awk
간단하고 효과적입니다.
답변2
그러면 다음이 변환됩니다.
awk '{print $1, $2, $3 * 10**$4}' file.csv
가정:
- e와 실제 지수 사이에는 공백이 있습니다.
- 인덱스는 각 행의 마지막 필드입니다.
특정 형식이 필요한 경우 printf
양식을 사용할 수 있습니다.
예를 들어:
awk '{printf( "%s %s %g "ORS,$1,$2,$3*10**$4)}' file.csv
다음을 인쇄할 수 있습니다.
1 1 1423
1 2 1589
1 3 85000
1 4 8900
1 5 8796
2 8 2.589e+28
큰 지수의 최종 형식을 표시하려면 마지막 줄을 추가하세요.
답변3
{ sed 's/ /+/3' | xargs printf '%G% G% G\n'; } <in >out
1 1 1423
1 2 1589
1 3 85000
1 4 8900
1 5 8796
%G
숫자가 이 값보다 훨씬 크면 정밀도 플래그를 사용해야 합니다.
답변4
다른 변형awk
스프린트 기능
awk 'NF==4{$(NF-1)=sprintf(CONVFMT, $(NF-1)$NF);NF=3}1' file