# AWK 의 기능을 디자인 한 사람들의 이니셜로 만들어짐
# A : Alfred V. [A]ho, W : Peter J. [W]einberger, K : Brian W. Kernighan
# 파일로부터 레코드를 선택하고, 선택한 레코드에 포함된 값을 조작하거나 데이터화 하기 위해 만들어짐
# awk [옵션] [awk 프로그램] [파일명] 형태로 사용
# 옵션
# -F : 필드 구분자 지정
# -f : awk 프로그램 파일 경로 지정
# -v : awk 프로그램에서 사용할 특정 variable 값 지정
# awk 프로그램 기본 구조
# pattern { action } 형태 => echo -e 'no\ttitle\n1\tsubject1' | awk '/sub/ { print }'
# pattern을 생략하면 모든 레코드가 적용됨 => echo -e 'no\ttitle\n1\tsubject1' | awk '{ print }'
# action 을 생략하면 기본 액션인 print 가 실행 됨 => echo -e 'no\ttitle\n1\tsubject1' | awk '/sub/'
# 지정된 문자열을 포함하는 레코드만 출력
echo -e 'no\ttitle\n1\tsubject1' | awk '/sub/ { print }'
# 파일의 전체 내용 출력
echo -e "a b c\nd e f" | awk '{ print }'
# 필드 값 출력
echo -e "a b c\nd e f" | awk '{ print $1 }'
# 필드 값에 임의 문자열을 같이 출력
echo -e "a b c\nd e f" | awk '{print "FIRST : "$1, "SECOND : "$2}'
# 필드 중 최대 값 출력
echo -e "1\t2\t3\t4\n5\t6\n7\tA\t8" | awk '{max = 0; for (i=3; i < NF; i++) max = ($i > max) ? $i : max; print max}'
# 파일에 저장된 awk program 실행
echo "{max = 0; for (i=3; i < NF; i++) max = (\$i > max) ? \$i : max; print max}" > awk.awk
echo -e "1\t2\t3\t4\n5\t6\n7\tA\t8" | awk -f awk.awk
# 필드 구분 문자 변경하기
# echo -e "1:2:3\n7 8 9" | awk -F ':' '{ print $1 }'
# 특정 필드 값 비교를 통해 선택된 레코드만 출력
echo -e "1\t2\t3\t4\n5\t6\n7\tA\t8" | awk '$1 == 5 { print $2 }'
# 특정 필드들의 합 구하기
echo -e "1\t2\t3\t4\n5\t6\n7\tA\t8" | awk '{sum += $3} END { print sum }'
# 레코드 단위로 필드 합 및 평균 값 구하기
echo -e "1\t2\t3\t4\n5\t6\n7\tA\t8" | awk '{ num = 0; sum = 0 } { num +=1; sum += ($3+$4+$5) } { print $0, "SUM="sum, "AVG="sum/num }'
# 필드에 연산을 수행한 결과 출력하기
echo -e "1\t2\t3\t4\n5\t6\n7\tA\t8" | awk '{print $1, $2, $3+2, $4, $5}'
# length 명령어
# 레코드의 길이를 출력하여 주는 명령어
# 'length($0) > n { print $N }' => echo -e 'no\ttitle\n1\tsubject1' | awk 'length($0) > 8 { print $1, $2 }'
# 특정 레코드만 출력하기
# exit 는 awk 도중 종료
echo -e "1 2\n3 4\n5 6" | awk 'NR == 2 { print $0; exit }'
# 레코드 또는 필드의 문자열 길이 검사
echo -e "12345678901234567890\n123456789012345678901" | awk ' length($0) > 20'
# BEGIN, END 명령어
# action 을 실행 하기 전과 후에 실행할 명령어를 지정 가능
# 'BEGIN { print word } { print $N } END { print word }'
echo -e 'no\ttitle' | awk 'BEGIN { print "START"} {print $2} END {print "END"}'
# for 명령어
# 레코드의 필드수만큼 루프를 가지는 명령어
echo -e "1\t2\t3\t4\n5\t6\n7\tA\t8" | awk '{ for (i=2; i <= NF; i++) print $i }'
echo -e "1\t2\t3\t4\n5\t6\n7\tA\t8" | awk '{ for (i=2; i <= NF; i++) total += $i }; END { print total }'
echo -e "1\t2\t3\t4\n5\t6\n7\tA\t8" | awk '{max = 0; for (i=3; i<NF; i++) max = ($i > max) ? $i : max ; print max}'
echo -e "1\t2\t3\t4\n5\t6\n7\tA\t8" | awk '{ for (i=3; i<NF; i++) max = ($i > max) ? $i : max ;} END { print max }'
# for 문은 가로로 감싸줄 수 있음
echo -e "1\t2\t3\t4\n5\t6\n7\tA\t8" | awk '{ for (i=2; i <= NF; i++) {print $i;print $i+1} }'
# 출력 필드 너비 지정하기
echo -e "1\t2\t3\t4\n5\t6\n7\tA\t8" | awk '{ printf "%-3s %-8s %-4s %-4s %-4s\n", $1, $2, $3, $4, $5}'