파일의 한 줄에 하나의 수학 방정식을 계산하는 방법은 무엇입니까?

파일의 한 줄에 하나의 수학 방정식을 계산하는 방법은 무엇입니까?

다음 내용이 포함된 파일이 있습니다.

37 * 60 + 55.52
34 * 60 + 51.75
36 * 60 + 2.88
36 * 60 + 14.94
36 * 60 + 18.82
36 * 60 + 8.37
37 * 60 + 48.71
36 * 60 + 34.17
37 * 60 + 42.52
37 * 60 + 51.55
35 * 60 + 34.76
34 * 60 + 18.90
33 * 60 + 49.63
34 * 60 + 37.73
36 * 60 + 4.49

이 파일의 각 줄에 대해 방정식을 계산하고 결과를 인쇄하는 셸 명령이나 Bash 스크립트를 작성해야 합니다. 예를 들어 첫 번째 행의 경우 인쇄된 내용을 보고 싶습니다 2275.52. 각 결과는 한 줄에 한 번씩 인쇄되어야 합니다.

나는 이것을 시도했지만 cat math.txt | xargs -n1 expr작동하지 않습니다. 이렇게 하는 것도 가능할 것 같지만 awk해당 명령의 구문에 익숙하지 않아서 그것이 무엇인지 모르겠습니다.

답변1

이것은 awk트릭을 수행하는 것 같습니다

while IFS= read i; do 
  awk "BEGIN { print ($i) }"
done < math.txt

~에서여기

($i)대신에 ( 해당 산술 표현식의 결과를 인쇄하는 대신 이름이 지정된 파일에 인쇄합니다 ) $i와 같은 산술 표현식 관련 문제를 피하기 위해 사용합니다 .1 > 2print 1 > 212print (1 > 2)0

쉘 변수의 확장으로 인해 $i결국 다음과 같이 해석됩니다.암호에 따르면 awk이는 본질적으로코드 삽입 취약점. 파일에 유효한 산술 표현식만 포함되어 있다고 보장할 수 없는 경우 몇 가지 입력 유효성 검사를 수행해야 합니다. 예를 들어, 파일에 행이 있으면 system("rm -rf ~")심각한 결과를 초래할 수 있습니다.

답변2

이것이 최선의 방법인지 확실하지 않습니다

bc < toto 

데이터로 무엇을 하려는지에 따라 다릅니다.

francois@zaphod:~$ cat > toto
37 * 60 + 55.52
34 * 60 + 51.75
36 * 60 + 2.88
36 * 60 + 14.94
36 * 60 + 18.82
36 * 60 + 8.37
37 * 60 + 48.71
36 * 60 + 34.17
37 * 60 + 42.52
37 * 60 + 51.55
35 * 60 + 34.76
34 * 60 + 18.90
33 * 60 + 49.63
34 * 60 + 37.73
36 * 60 + 4.49
francois@zaphod:~$ while read ; do echo " $REPLY" | bc  ; done < toto
2275.52
2091.75
2162.88
2174.94
2178.82
2168.37
2268.71
2194.17
2262.52
2271.55
2134.76
2058.90
2029.63
2077.73
2164.49
francois@zaphod:~$

BC 명령 없이는 십진수 값을 사용할 수 없습니다.

francois@zaphod:~$ while read ; do echo $(( "REPLY" )) ; done < toto
-bash: 37 * 60 + 55.52: syntax error: invalid arithmetic operator (error token is ".52")
francois@zaphod:~$

답변3

펄이 있는 경우:

perl -ne 'print eval $_,"\n"' math.txt

(이것을 사용하여 랩톱에서 초당 50000개의 행을 얻습니다.)

답변4

결과가 필요한 경우 아래에 제공된 답변을 얻을 수 있습니다.@프랑수아-p

재미와 게임을 위해 paste다음을 추가하세요 sed:

$ paste <(sed 's/\($\)/\1\t=/g' somefile) <(bc < somefile)
37 * 60 + 55.52 =   2275.52
34 * 60 + 51.75 =   2091.75
36 * 60 + 2.88  =   2162.88
36 * 60 + 14.94 =   2174.94
36 * 60 + 18.82 =   2178.82
36 * 60 + 8.37  =   2168.37
37 * 60 + 48.71 =   2268.71
36 * 60 + 34.17 =   2194.17
37 * 60 + 42.52 =   2262.52
37 * 60 + 51.55 =   2271.55
35 * 60 + 34.76 =   2134.76
34 * 60 + 18.90 =   2058.90
33 * 60 + 49.63 =   2029.63
34 * 60 + 37.73 =   2077.73
36 * 60 + 4.49  =   2164.49

관련 정보