Skip to content

Linux 기본명령어 awk #
Find similar titles

Structured data

Category
Programming

리눅스 기본명령어 - awk #

awk는 패턴 탐색과 처리를 위한 명령어로 간단하게 파일에서 결과를 추려내고 가공하여 원하는 결과물을 만들어내는 유틸리티이다. 즉 파일에서 패턴이 일치하는 행을 찾아서 지정한 조치를 수행해주는 명령어이다. awk 명령은 사용자가 정의한 명령어 집합을 이용하여 파일 집합과 사용자가 제공한 확장 표현식을 한번에 한 행씩 비교한 다음 확장 정규식과 일치하는 모든 행에 작용하여 특별한 작업을 해 준다. awk 명령의 패턴 탐색은 grep 명령의 패턴 탐색보다 더 일반적이고, 입력 텍스트 행에 대해 여러 가지 조치를 실행할 수 있으며 awk 명령 프로그래밍 언어는 컴파일을 필요로 하지 않고, 변수, 수치 함수, 문자열 함수 및 논리 연산자를 사용할 수 도 있다. 보통은 sed명령과 조합하여 많이 사용하기도 한다.

초기 개발자 Aho, Weinberger, Kernighan의 첫글자를 따서 이름지어진 awk는 GNU 프로젝트에서 만들어진 텍스트 처리 프로그래밍 언어로 유닉스 계열의 OS에서 사용 가능하며, 텍스트 형태로 되어있는 입력 데이터를 행과 단어 별로 처리해 출력한다.

기본적으로 패턴과 패턴을 처리하는 명령어 짝을 늘여놓은 구조로 이루어져 있는데, 입력으로부터 한 줄씩을 읽어서 정규 표현식으로 조건이 맞는지를 검사하고 참으로 판명되면 그 줄에 대해 명령어를 실행하는 형식이다.

기본적인 사용형식은 다음과 같다.

$ awk 'pattern' filename 조건
$ awk '{action}' filename 몇 번째 필드
$ awk 'pattern {action}' filename 무슨 조건에 몇 번째 필드

$ awk [ -F fs ] [ -v var=value ] [ 'prog' | -f progfile ] [ file ...  ]

1. (필드) 개행으로 구분한다 
2. 자료 처리 및 리포트 생성에 사용하는 프로그래밍 언어 
3. 입력 데이터로는 표준 입력, 여러 개의 파일 또는 다른 프로세스의 결과를 사용 할 수 있다 
4. 사용자가 지정한 패턴 검색이나 특별한 작업수행 위해 파일을 행 단위로 조사한다 
5. $0은 모든 필드

사용법은 다음과 같다.

$ awk -F delim '{ print $x }'

기본적인 사용법은 위의 형태로 많이 사용한다. awk 명령어와 구분자 그리고 출력할 내용을 써 주면 된다.

$ awk '{print $1}' file

파일의 첫 번째 필드를 출력한다, 첫 번째 필드는각 행의 맨 왼쪽 경계에서 시작 공백문자로 구분하여 출력하는데 이 경우에는 첫번째가 된다.

특정 폴더 내에 있는 파일 목록만 가져오는 경우를 생각해보면 ls 명령어를 사용해서 > 로 리다이렉션 시켜서 vi로 작업하는 방법을 사용할 수 도 있고 그냥 복사해서 한 라인에 하나씩 오도록 엔터를 쳐서 사용해도 된다. 그러나 이 경우 awk명령어를 사용하면 보다 편하게 사용할 수 있다. 먼저 ls -al 를 해 보면 다음과 같이 상세 정보를 출력한다.

$ ls -al 
-rw-r--r--   1 kylee  wheel  10235636 11 18 13:44 201611101584be7224a770
-rw-r--r--   1 kylee  wheel   1897350 11 18 13:44 201611101584be7224a770.gz
-rw-r--r--   1 kylee  wheel     70597 11 18 13:44 201611101584be7224a770.gz.csi
-rw-r--r--   1 kylee  wheel  10368400 11 18 13:44 201611101584be8191b560
-rw-r--r--   1 kylee  wheel   1927540 11 18 13:44 201611101584be8191b560.gz
-rw-r--r--   1 kylee  wheel     63101 11 18 13:44 201611101584be8191b560.gz.csi
-rw-r--r--   1 kylee  wheel   9907325 11 18 13:43 201611101584be8e59c610
-rw-r--r--   1 kylee  wheel   1849363 11 18 13:44 201611101584be8e59c610.gz
-rw-r--r--   1 kylee  wheel     77322 11 18 13:44 201611101584be8e59c610.gz.csi
-rw-r--r--   1 kylee  wheel   8893514 11 18 13:44 201611101584be99aab100
-rw-r--r--   1 kylee  wheel   1673036 11 18 13:44 201611101584be99aab100.gz
-rw-r--r--   1 kylee  wheel     66183 11 18 13:44 201611101584be99aab100.gz.csi

이 상황에서 맨 마지막에 있는 파일을 복사해서 편집해도 되지만 불편하다. 간단히 다음과 같이 사용하면 된다.

$ ls -al | awk '{ print $9}'

이렇게 명령을 내려주면 awk 프로그램이 공백으로 분리해서 마지막 즉 9번째가 파일명이 되는데 요 번호를 $9와 같이 써 주면 깔끔하게 다음과 같이 출력이 된다.

201611101584be7224a770
201611101584be7224a770.gz
201611101584be7224a770.gz.csi
201611101584be8191b560
201611101584be8191b560.gz
201611101584be8191b560.gz.csi
201611101584be8e59c610
201611101584be8e59c610.gz
201611101584be8e59c610.gz.csi
201611101584be99aab100
201611101584be99aab100.gz
201611101584be99aab100.gz.csi

다른 방법을 쓸 필요도 없이 간단하게 내가 원하는 결과를 얻을 수 있다. >를 이용해서 파일에 저장해서 따로 사용할 수 있다.

$ history | awk '{ print $2 }' \ | sort | uniq -c | sort -nr | head -3

이 예는 리눅스를 사용하면서 가장 많이 내린 명령어를 찾아서 출력해주는 간단한(?) 명령어 조합이다. 특히 생물학 데이터를 다룰 때는 특정 형식으로 되어 있는 경우가 많다. 다음과 같이 bed 파일이 있는데 이 파일을 gbrowse 사용하기 위해서는 직접 사용할 수 없고 GFF3 형식으로 변환해주면 브라우저에서 그림으로 확인할 수 있는 상태가 된다. 예제로 애기장대의 bed파일 내용인데 이 내용을 아래 명령어로 바꿔주면 별도의 프로그래밍 없이도 bed --> gff로 변경할 수 있다.

chr1 2025600 2027271 AT1G06620.10 + 2025617 2027094 0 3541,322,429,
$ awk '{print $1”\tawk\tmRNA\t”$2”\t”$3”\t” \ $5”\t”$6”\t0\t”$4 }’ example.bed

그러면 내가 원하는 형식으로 변경이 되어 사용할 수 있다.

옵션 #

  • -F 필드구분자 : 필드구분자를 지정할 때 사용하며, 기본 필드구분자는 공백이다.
  • -f 파일명 : 스크립트파일을 불러온다.

#

몇 가지 사용법을 추가로 확인하면 다음과 같다.

$ awk '/Arabidopsis/{printf $1, $2}' file

파일에서 Arabidopsis를 포함하는 행들의 첫 번째와 두 번째 필드를 출력한다. 이 경우에는 특정 단어로 시작하는 행을 찾아서 공백으로 구분한 뒤 필요한 컬럼을 출력한다.

$ df | awk '$2 > 10000 '

df ( 현재 디바이스 정보 ) 명령어를 통해 출력되는 내용 중 두 번째 필드가 10000보다 큰행을 출력한다.

$ date | awk '{print "Month : $2\n Year"$6}'

date 명령어를 통해 출력되는 시간 정보 중 두 번째 필드와 여섯번 째 필드를 서로 개행 하여 출력하면 월과 년을 출력할 수 있다.

$ awk '{print NR, $1, $3}' file

NR(하나의 레코드를 처리한 뒤 1 이 증가하는 변수)을 사용하여 레코드 번호와 함께 파일의 내용대로 출력한다. 그러면 각 라인별로 번호를 매겨 정보를 줄 수 있다.

$ awk -F : '/root/{print $0}' /etc/passwd

이 경우에는 보통 \t이나 공백으로 라인을 나누는데 특이한 구분자로 구분 되어 있는 경우 별도로 구분자를 지정해 줄 수 있는데 -F 다음에 구분자를 써 주면 된다. 이 경우 " : " 구분자를 기준으로 필드를 나누며 root를 포함하는 행을 출력한다. /expression/이 되는데 // 안에는 정규표현식을 사용하여 원하는 패턴을 찾을 수도 있다.

$ awk -F : '\^[ab]\{print $1}' file

a나 b로 시작하는 행의 첫 번째 필드를 출력한다.

$ awk -F '[\t]' '{print $1, $2, $3}' file

Tab 으로 필드를 구분하며 첫 번째, 두 번째, 세 번째, 필드를 출력한다.보통 엑셀에서 작업한 파일을 텍스트 파일로 변환하면 TSV, CSV형태로 저장한다. 이때 구분자는 \t(탭)이나 ,(콤마)로 구분이 되는데 이 경우 구분자를 지정해주면 편하게 작업할 수 있다.

$ awk '$1 ~ /[aA]TG/' seq.fasta

~는 특정 레코드나 필드 내에서 일치하는 정규 표현식 패턴이 존재하는지 검사 위해 쓰인다

$ awk '$1 !~ /*$' protein.fasta

첫 번째 필드가 * 로 끝나지 않는 행들을 출력한다. 즉 종료 서열이 없는 서열을 찾을 때 사용한다.

Suggested Pages #

0.0.1_20140628_0