Unix/*Nix계통 팁

Perl one liner와 awk로 평균내기

알 수 없는 사용자 2013. 8. 31. 20:03

!/bin/bash

cat xxxxx | perl -lane 'print $1 if /[0-9]+m(.+)s/' \
    | awk '{print $1; sum+=$1} END { print "Avg = ",sum/NR }'


echo end


awk 자체에 필터 기능이 어느정도 있는 것으로 알고 있으나 perl을 주력으로 하는 나로서는 perl을 한번 거쳐서 원하는 숫자만 나오게 한 다음 그것을 awk로 평균내는 방향이 쉬운 것 같다.

perl에 -lane을 붙이면 grep처럼 쓸 수 있는데... 알다시피 perl의 regular expression에서 match되는것은 숫자 변수가 붙으니까... 그래서, 결국엔 regexp에 맞춰서 match가 일어나면 print를 적절히 해주는 one liner가 된다. 아... grep도 이런게 되던가 ㄱ-; 뭐든 본인이 편한거 쓰자.

pipe뒤의 awk는 awk로 평균내기를 검색하면 쉽게 나오는 것이니 어려울 것 없다.

댓글로 awk없이 작업을 가능하게 해주신 분이 계시다!

cat xxx | perl -lne 'if (/[0-9]+m(.+)s/) { $s+=$1; } END { print $s/$. }'

Match되면 sum하는데, 끝나면 $s (누적값 있는변수)를 $. ("$점", 펄의 $_와 비슷하게 특수목적의 변수인데 line 개수를 세어주는 거) 으로 나누면 평균이 완성된다! lane에서 a 옵션이 빠져서 lne가 되었는데, a는 autosplit 가능으로서 정규표현식을 이용해 데이터를 뽑아내는 이 상황에서는 필요 없다.