각 줄에 주어진 수학 표현식을 평가하는 대화형 수학 계산기인 awk를 만드는 스크립트를 원합니다.
즉, 다음과 같은 표현식을 평가하기 위해 awk 명령을 구성하지 마십시오.
$ awk 'BEGIN{print 180/1149}'
0.156658
$ awk 'BEGIN{print (150+141)/1149}'
0.253264
내 스크립트에서 수학 표현식을 입력으로 받아 대화형으로 계산하기를 원합니다. 따라서 세션은 다음과 같습니다(입력 및 출력 대체).
180/1149
0.156658
(150+141)/1149
0.253264
1 + 2
3
2 * 3 - 5
1
하지만 나는 이것을 스스로 할 수 없습니다:
$ awk '{print}'
180/1149
180/1149
^C
$ awk '{print $0}'
180/1149
180/1149
1 + 2
1 + 2
^C
awk를 사용하는 쉬운 해결책이 없다면 Perl과 같은 다른 방법은 무엇일까요?
답변1
수리력 평가는 언어 awk
/ 언어 평가 perl
의 일부로 완료 됩니다. 런타임에 임의의 문자열을 평가하는 Perl 코드가 perl
있으므로 다음을 수행할 수 있습니다.eval
perl -lne 'print eval $_'
그러나 awk
그렇지 않습니다(GNU의 경우 awk
디버거에서는 그렇습니다. 아래 참조). 따라서 awk
각 줄에 대해 실행을 입력하고 코드 인수에 해당 줄의 내용을 전달해야 합니다(예: GNU 사용) xargs
.
xargs -rd '\n' -I CODE awk -- 'BEGIN{print(CODE)}'
다음과 같이 할 수도 있습니다.
sed 's/.*/BEGIN{print(&)}/' | awk -f -
awk
모든 코드 줄을 해석하는 코드를 실행 하지만 awk
입력 끝에 도달한 경우에만 평가를 시작하므로 대화형으로 사용할 수 없습니다. 그러나 과거 평가 결과를 재사용할 수 있습니다 perl
. 좋다:
a = 3+4
a*2
7
그러면 인쇄됩니다 14
.
Gawk 디버거 사용
awk
eval
해석을 위해 awk 코드를 전달할 수 있는 디버거 모드가 있으므로 다음을 사용하여 이를 하이재킹할 수 있습니다.
sed -u 's/["\\]/\\&/g;s/.*/eval "print(&)"/' | gawk -D -f /dev/null
답변2
대화식으로 사용하십시오.기원전
비대화형 방식으로 표현식 평가를 스크립트로 작성하려는 경우:
$ cat file
180/1149
(150+141)/1149
1 + 2
2 * 3 - 5
$ bc < file
.15665796344647519582
.25326370757180156657
3
1
입력과 출력을 인터리브하기 위해 다음을 사용할 수 있습니다.반죽
$ paste -d '\n' file <(bc < file)
180/1149
.15665796344647519582
(150+141)/1149
.25326370757180156657
1 + 2
3
2 * 3 - 5
1
답변3
펄로 실행해보세요!
...또는 awk를 사용할 수도 있습니다. 다음 (2차) awk 스크립트를 고려해보세요.run-in-awk
#!/usr/bin/awk -f
{ system( "awk 'BEGIN{print " $0 "}' ") }
chmod +x run-in-awk
실제로 awk에게 awk를 실행하도록 요청한 후
$ run-in-awk example
0.156658
0.156658
0.253264
0.253264
3
3
1
1
표준 입력 키보드 입력에서도 작동합니다.
답변4
awk와 함께 sh를 사용할 수 있는데 왜 awk나 Perl만 사용합니까?
#!/bin/sh
while read e_x__p_ress_ion___; do
awk "BEGIN{print ${e_x__p_ress_ion___}}"
done
그러면 표현식을 읽고 이를 변수에 저장합니다. 그런 다음 awk print를 호출하고 변수를 전달합니다. 이것은 control-c에서 종료되는 무한 루프입니다.
이러한 이상한 변수 이름은 해당 스크립트가 다른 스크립트의 변수를 변경하지 못하도록 보호하기 위해 사용됩니다.