두 파일의 값을 곱하되 소수점 이하 자릿수는 유지하세요.

두 파일의 값을 곱하되 소수점 이하 자릿수는 유지하세요.

나는 가지고있다파일 1.txt

0.1234
0.333
0.22
0.1

그리고파일 2.txt

2
10
100
100

나는 줄을 곱하고 file1.txt가 이 위치/줄에 있는 소수 자릿수만큼 출력하는 명령을 찾고 있습니다. 출력.txt

0.2468
3.330
22.00
10.0

지금까지 나는 다음 명령을 사용했습니다. paste file1.txt file2.txt | awk '{printf "%.4f", ($1 * $2)}' > output.txt 그러나 물론 "%.4f"는 항상 소수점 이하 4자리를 생성합니다...

답변1

awk 구현이 기본 C 라이브러리의 동적 너비 및 정밀도 기능에 대한 액세스를 제공하는 경우,숫자에는 file1.txt가수 지수 표현이 포함될 수 없습니다.1.23e4, 그러면 다음과 같은 작업을 수행할 수 있습니다.

$ paste file1.txt file2.txt | 
  awk '{split($1,a,/[.]/); printf "%.*f\n", length(a[2]), ($1 * $2)}'
0.2468
3.330
22.00
10.0

아니면 좀 더 강력한 것일 수도 있습니다.

paste file1.txt file2.txt | 
  awk '{l = (match($1,/[.][[:digit:]]+/) > 0) ? RLENGTH-1 : 0; 
  printf "%.*f\n", l, ($1 * $2)
}'

답변2

paste+ 로 bc:

$ paste -d '*' file1.txt file2.txt | bc
.2468
3.330
22.00
10.0

출력되는 소수 자릿수는 두 피연산자의 최대값이 되며 반드시 첫 번째 피연산자는 아닙니다.

대신 sed -E 's/^(-?)\./\10./'에 (또는 0.2468대신 에 ) ..2468-0.1-.1

그리고 awk:

$ awk -F. '{getline x < "file2.txt"; printf "%.*f\n", length($2), $0*x}' file1.txt
0.2468
3.330
22.00
10.0

답변3

awk를 사용하십시오.

$ awk '
    NR==FNR { mult[NR]=$1; next }
    {
        prec = ( /\./ ? length($1)-index($1,".") : 0 )
        printf "%.*f\n", prec, $1 * mult[FNR]
    }
' file2.txt file1.txt
0.2468
3.330
22.00
10.0

관련 정보