1) 리눅스 명령어 awk, 원하는 항목만 추출하여 더하기

리눅스 명령어 중 awk를 사용하여 여러 줄의 문자열 중 각 라인에서 원하는 부분만 추출하여 더하는 간단한 스크립트를 작성한다.
예를 들어 다음과 같은 문자열 파일이 있을 때(각 항목은 버티컬 바(‘|’)로 구분되어 있다, 파일 이름은 ‘sales.txt’)
apple|1|3000
banana|2|2400
grape|4|3500

첫 번째 항목은 품목명을 나타내고 두 번째 항목은 판매 개수, 세 번째 품목은 판매 단가를 나타낸다.
여기서 총 판매액을 구하고 싶을 때, 각 라인의 판매 개수 * 판매 단가를 모두 더하면 되는데 이를 awk 라는 명령어를 사용하면 편하게 구현할 수 있다.

먼저 세 가지 항목 중 첫 번째는 제외하고 나머지 두 번째와 세 번째 항목을 추출해야 한다.

awk '{ \
      split($0, split_line, "|");  \
      print split_line[2];  \
      print spilt_line[3]; \
}' sales.txt

awk 명령어를 사용하는 방법은 크게 두 가지가 있는데 첫 번째는 위와 같이 awk 명령어 기술 후 awk 문을 바로 이어서 붙이는 것이고
다른 하나는 awk문을 파일에 저장한 후 ‘awk -f awk파일명’ 과 같은 방식으로 사용하는 것이다.
awk문이 길어질 경우 명령행에 적는 것이 복잡해지기 때문에 awk문 파일로 관리하는 것이 더 합리적이다.

이제 위 코드 설명에 들어가자면,
awk문은 ‘{ }’ 사이에 기술한다. 위 코드에서는 2~4번째 줄이 awk문이 되는 것이다.
2: split 함수를 사용한다. awk는 다양한 내장함수를 사용할 수 있는데, 구분자를 기준으로 문자열을 자르고 싶을 때 사용하는 함수가 바로 split이다.
split 함수의 첫 번째 인자는 자르고자 하는 대상 문자열이며, 위 코드에서는 ‘$0’이다. awk에서 $0은 라인 전체를 의미한다.
split 함수의 두 번째 인자는 대상 문자열을 자르고 난 후 저장할 배열 변수이다. 위 코드에서는 split_line이라는 변수에 저장시킨다.
세 번째 인자는 구분자를 지정한다. sales.txt 파일에서 각 라인의 구분자는 버티컬 바(‘|’)이기 때문에 구분자를 “|”으로 지정해준다.

3: 구분자로 잘라진 문자열들이 저장된 배열 변수 split_line의 두 번째 인덱스를 출력한다.
다른 프로그래밍 언어의 배열과 달리 첫 번째 인덱스가 1부터 시작하기 때문에 split_line 변수에는 1:apple, 2:1, 3:3000 과 같은 식으로 저장된다.
두 번째 인덱스를 출력했기 때문에 sales.txt 파일의 각 라인의 두 번째 항목인 판매 개수가 출력된다.

4: 세 번째 인덱스를 출력한다.
세 번째 인덱스는 sales.txt 파일의 각 라인의 세 번째 항목인 판매 단가가 출력된다.

우리는 판매 개수와 판매 단가를 곱한 후 모두 더한 값을 구하는 것이 최종 목표이기 때문에 위 코드로는 구할 수 없다.
위 코드를 고쳐서 판매 개수와 판매 금액을 곱한 후 출력해보자

awk '{ \
      split($0, split_line, "|");  \
      line_sum = split_line[2] * spilt_line[3];  \
      print line_sum; \
}' sales.txt

2: 판매 개수(split_line[2])와 판매 금액(split_line[3])을 곱한 후 line_sum 변수에 저장한다.
3: line_sum 변수를 출력한다.

위 코드를 실행시키면 다음과 같은 출력값을 확인할 수 있다.

3000
4800
14000

이제 세 개의 값을 더한 최종 판매 금액만 구하면 된다.

awk 'BEGIN{ \
    total_sum=0; \
}{ \
    split($0, split_line, "|");  \
    total_sum += split_line[2] * split_line[3]; \
}END{ \
    print total_sum; \
}' sales.txt

BEGIN과 END라는 키워드가 눈에 띌 것이다. awk문 내부는 해당 파일의 각 라인을 읽으면서 수행된다. sales.txt는 총 라인수가 3이기 때문에 awk ‘{}’ 내부는 세 번 실행되는 것이다. 그런데 이번 예제와 같이 각 라인에 영향을 받지 않고 파일 전체에서 관리하고 싶은 코드가 있을 경우에는 BEGIN과 END를 사용한다. 키워드의 의미 그대로 파일을 처음 읽어들일 때 BEGIN{ } 내부가 실행되고 파일을 전부 읽어들인 후 END{ } 내부가 실행된다.
2: BEGIN 내부에 total_sum 이라는 변수를 선언하며 0을 대입하고 있다.
5: 2번째 줄에서 선언한 total_sum 변수에 판매 개수 * 판매 단가 값을 누적 합산해주고 있다. ( += )
7: 마지막으로 프로그램 종료 전, total_sum을 출력한다.

위 코드를 실행하면 다음과 같은 출력값을 확인할 수 있다.

21800

따라서 총 판매 금액은 21,800이 되는 것이다.
동일한 기능을 수행하는 프로그램을 파이썬이나 자바로도 충분히 작성할 수 있지만, 이런 간단한 스크립트 연산만으로도 원하는 값을 구할 수 있다면 굳이 파이썬, 자바 코드까지 사용할 필요는 없다는 게 내 생각이다.

awk는 사용자의 능력에 따라서 무궁무진하게 이용될 수 있는 명령어이다. 위에서 소개된 것들은 awk의 전체 기능 중에서도 가장 간단한 것들만 사용한 것으로
나머지 awk 기능을 자유자재로 사용할 수 있다면 그것만으로도 awk라는 또다른 강력한 언어 스킬을 보유하게 되는 것이다.