awk를 사용하여 루프 값을 합산하는 데 문제가 있습니다.

awk를 사용하여 루프 값을 합산하는 데 문제가 있습니다.

스크립트 끝을 반영하기 위해 합계를 구하려고 하는데 36962제대로 작동하지 않습니다. $TOTAL어떤 제안이 있으십니까? 이것은 학교 프로젝트이고 저는 Bash를 처음 접했습니다.

TOTAL=0
while read p; do
    awk '{ if ($1 > 100 ) print TOTAL+=$1}'
    echo $TOTAL
done < ipuniq.txt
  • 6578
  • 6723
  • 32735
  • 36962
  • 에코 -> 0

답변1

TOTAL변수는 쉘 변수이므로 awk알 수 없습니다. awk명령 에서 TOTAL변수는 반복할 때마다 설정되지 않으므로 매번 단일 값으로 재설정된 다음 인쇄됩니다.

awk게다가 이와 같은 루프에 사용하는 것은 무의미해 보입니다.

awk다음 패드 1개를 사용하여 직접 이 작업을 수행할 수 있습니다.

awk '$1 > 100 { total+=$1 } END { print total }' ipuniq.txt

루프나 다른 명령이 필요하지 않습니다.


그러나 과제에 bash/shell을 사용해야 하는 경우 다음과 같이 할 수 있습니다.

total=0
while read -r p _; do
    ((p>100)) && total=$((total+p))
done < ipuniq.txt
echo "$total"

이는 쉘 산술 표현식을 사용하여 값이 p100보다 큰지 확인하고, 그렇다면 에 추가합니다 total.

-r또한 참고: 이 옵션을 명령에 추가한 read이유는 백슬래시를 문자 그대로 인쇄하기 때문입니다. (사용 사례에는 필요하지 않을 수도 있지만 -r이 방법을 사용하지 않는 특별한 이유가 없는 한 항상 사용하는 것을 선호합니다.)

또한 원치 않는 입력으로 설정되는 _것을 방지하기 위해 매개변수 이름을 추가했습니다 . 남은 모든 단어를 마지막 매개변수에 할당하므로 파일에 숫자와 IP가 포함되어 있다고 가정합니다. 예:pread

1 10.10.10.10
2 10.10.10.11

문제를 포착할 매개변수가 없으면 p다음과 같이 설정됩니다.

p='1 10.10.10.10'

그 다음에:

p='2 10.10.10.11'

관련 정보