[Linux] 리눅스 사용자를 위한 awk 명령어의 사용법 (주요 사용 용도 : 텍스트 데이터 처리)

정보

  • 업무명     : 리눅스에서 awk 명령어를 사용하는 기초적인 방법 정리

  • 작성자     : 박진만

  • 작성일     : 2020-03-14

  • 설   명      :

  • 수정이력 :

 

 내용

[특징]

  • 리눅스에서 awk 명령어 사용방법 소개

 

[활용 자료]

  • 없음

 

[자료 처리 방안 및 활용 분석 기법]

  • 없음

 

[사용법]

  • 작업 환경 구축

  • 소스 코드 작성 및 실행

  • 실행 결과 확인

 

[사용 OS]

  • Linux (CentOS v7.0)

  • VMware Workstation Pro v15.5

 

[사용 언어]

  • shell script (bash)

 

 소스 코드

[들어가기]

  • awk는 하나 이상의 공백으로 구분 된 여러 열의 텍스트 데이터를 처리 할 때 유용한 도구이다. 

  • 사칙 연산 역시 가능하다.

  • 예를 들어 아래와 같은 a.txt 파일이 있다고 가정해보자

1 2
3 4
  • 여기서 아래의 명령을 실행하면

awk '{print $1 * $2;}' a.txt
# 또는
cat a.txt | awk '{print $1 * $2;}'
  • 출력 결과는 아래와 같다.

2
12
  • 이 때 구분 기호는 기본적으로 하나 이상의 공백이나 탭이 사용되어 있어야 한다.

  • 그리고 공백이나 탭이 사이에 여러개가 있더라도 하나의 구분으로 간주한다.

 

[기초적 사용법 예시]

  • 쉼표로 구분된 값 (CSV) 처리하기

    • 쉼표로 구분된 값을 처리하기 위해서는 -F 옵션에서 구분 기호를 지정할 수 있다.

    • 예를 들어 아래와 같은 b.txt 파일이 있다고 가정하자

1,2,3
4,5,6
7,8,9
  • 여기서 아래의 awk 명령을 실행하면

cat b.txt | awk -F, '{print $1}'
  • 아래의 결과가 도출된다. 즉 -F 명령으로 구분자를 지정한 후 print를 이용해 첫번째 컬럼만 출력한 형태이다.

1
4
7

 

 

  • 행 번호 출력하기

    • 행 번호를 출력하기 위해서는 print 에 NR 옵션을 추가한다.

cat b.txt | awk -F, '{print NR " " $0;}'
1 1,2,3
2 4,5,6
3 7,8,9
  • 여기서 $0 은 전체 컬럼을 출력한다는 의미이다.

  • 만약 행 번호를 1이 아닌 0부터 시작하고자 한다면 아래처럼 사용할 수 있다.

awk_example]$ cat b.txt | awk -F, '{print NR-1 " " $0;}'
0 1,2,3
1 4,5,6
2 7,8,9

 

 

  • 특정 열에 특정 문자열이 존재하는 행만 출력하기

    • 아래와 같은 파일이 있다고 가정하자 (c.txt)

a b c
d e f
g h i
  • 여기서 첫번째 열에서 "a" 가 있는 행만 출력하고 싶은 경우 아래와 같이 쓴다.

cat c.txt | awk '$1=="a"'
a b c
  • 만약 첫번째 열에서 "a" 가 없는 행만 출력하고 싶다면

cat c.txt | awk '$1!="a"
d e f
g h i

 

 

  • 특정 열에 특정 패턴이 존재하는 행만 출력하기

    • 패턴을 매칭하기 위해서는 슬레시 (/) 사이에 정규식을 넣어서 사용한다. ('/pattern/') 

    • 아래의 예시는 2번째 컬럼에서 e로 시작하는 문자가 있는 행만 출력하는 예시이다.

cat c.txt | awk '$2~/^e/'
d e f

 

 

  • 숫자가 적힌 텍스트 파일에서 합계 / 평균 / 최대 / 최소값 계산하기

    • 아래와 같은 파일이 있다고 가정하자 (d.txt)

100
200
300
400
500
  • 합계를 계산

awk '{sum+=$1}END{print sum}' d.txt
1500
  • 평균을 계산

awk '{sum+=$1}END{print sum/NR}' d.txt
300
  • 최댓값을 계산

awk 'NR==1 {max=$1} {if($1 > max) max = $1} END {print max}' d.txt
500
  • 최솟값을 계산

awk 'NR==1 {min=$1} {if($1 < max) min = $1} END {print min}' d.txt

100

 

 

  • 텍스트 파일의 각 행의 문자 수 구하기

    • 아래와 같은 파일이 있다고 가정하자 (e.txt)

a
ab
abc
abcd
abcde
  • 각 행의 문자수 구하기 (바이트 아님)

cat e.txt | awk '{print length();}'
1
2
3
4
5

 

 

 참고 문헌

[논문]

  • 없음

[보고서]

  • 없음

[URL]

  • 없음

 

 문의사항

[기상학/프로그래밍 언어]

  • sangho.lee.1990@gmail.com

[해양학/천문학/빅데이터]

  • saimang0804@gmail.com

 

 

 

 

 

 

 

 

 

 

 

 

 

 

본 블로그는 파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있음