bash script2023. 9. 15. 13:28

 

반달가면 이글루에서 백업 - http://bahndal.egloos.com/621446

awk를 이용해서 합계를 구할 때, 입력이 유효하지 않은 경우가 발생할 수 있다. 예를 들어 특정 파일에서 grep으로 특정 항목만 추출한 후에 해당 항목의 합계를 구하려는데, 그 항목 자체가 파일에서 존재하지 않는 경우다. awk를 이용한 항목별 합계 계산 방법은 이전 게시물을 참고하자. 여기로

예를 하나 생각해 보자. my_data.txt의 파일이 아래와 같다.

# my_data.txt 파일 내용 확인 (구분자는 탭)
cat my_data.txt
2018.1.3 apple 10
2018.1.3 orange 3
2018.3.10 apple 2

위의 파일에 대해서 사과(apple)가 몇개 팔렸는지만 궁금하다면 아래와 같은 작업을 할 수 있다.

# 사과(apple) 항목의 합계 계산
cat my_data.txt | grep apple | awk -F '\t' '{ res+=$3 } END { print res }'
12

물론 grep을 사용하지 않고 awk 안에서도 특정 항목을 걸러낼 수 있겠지만(이에 대한 자세한 내용은 이전 게시물을 참고하자. 여기로), 합계를 구하기 전에 뭔가 앞쪽에 이것 저것 복잡한 작업이 있고 그 중간에 grep이 포함될 수도 있으므로 상황에 따라 위의 예시가 유효할 수 있다.

사과에 대해서는 문제가 없는데, 만약 파일에 없는 망고(mango)가 몇개 팔렸는지 구하려 한다면 문제가 발생할 수 있다.

# 망고(mango) 항목의 합계 계산 (my_data.txt에 없는 항목)
cat my_data.txt | grep mango | awk -F '\t' '{ res+=$3 } END { print res }'

위의 경우 출력값이 "0"이 아니라 아예 나오지 않는다. 만약 이 작업 결과를 변수에 저장하고 나서 유효한 수자로 가정하여 수치 연산을 하려 한다면 오류가 발생할 것이다.

# 망고 항목의 합계를 변수 mango_sum에 저장
mango_sum=`cat my_data.txt | grep mango | awk -F '\t' '{ res+=$3 } END { print res }'`

# 결과값에 대한 연산 시도 (오류 발생)
echo "$mango_sum / 10" | bc
(standard_in) 1: syntax error

따라서 이러한 상황이 발생할 가능성이 있다면, 값이 유효하지 않을 경우에는 "0"이라고 출력하도록 만들어 주는 것이 좋겠다. awk에서 결과를 출력하는 부분에 if 조건문을 사용하면 된다. awk에서 합계를 저장한 변수 res의 값이 0보다 크면 res를 그대로 출력하고, 그렇지 않으면 "0"을 출력하도록 아래와 같이 변경한다.

# 망고(mango) 항목의 합계 계산
cat my_data.txt | grep mango | awk -F '\t' '{ res+=$3 } END { if (res>0) { print res } else { print "0" }'
0

복잡한 스크립트에서 합계를 구해서 나중에 다른 작업에 활용해야 하는 경우엔 위와 같이 결과값이 항상 유효하도록 처리해 주자.

728x90
Posted by 반달가면