다음 내용이 포함된 파일이 있습니다.
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 > 2
print 1 > 2
1
2
print (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