부동 소수점 숫자를 10진수로 변환

부동 소수점 숫자를 10진수로 변환

디렉토리에 여러 개의 "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

이는 파일의 부동 소수점 숫자를 가정합니다.

  1. "e" 뒤에 추가 공백이 있습니다.
  2. 양수 지수의 경우 "+"를 생략합니다.
  3. 매우 큰 지수는 없습니다. 그렇지 않으면 awkfp로 인쇄됩니다.

awk's/e /e/' 변환이 가능 sed하지만(그래서 필요하지 않음) 너무 늦어서 뇌가 피곤해졌습니다. sed | awk간단하고 효과적입니다.

답변2

그러면 다음이 변환됩니다.

awk '{print $1, $2, $3 * 10**$4}' file.csv

가정:

  1. e와 실제 지수 사이에는 공백이 있습니다.
  2. 인덱스는 각 행의 마지막 필드입니다.

특정 형식이 필요한 경우 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

관련 정보