Linux
기본명령어
awk
#
Find similar titles
- (rev. 5)
- Kyooyeol Lee
Structured data
- Category
- Computer science
awk #
NAME #
awk – 패턴 탐색 과 처리를 위한 언어
SYNOPSIS #
간단하게 파일에서 결과를 추려내고 가공하여 원하는 결과물을 만들어내는 유틸리티이다. 즉 파일에서 패턴이 일치하는 행을 찾아서 지정한 조치를 수행해주는 명령어이다. awk 명령은 사용자가 정의한 명령어 집합을 이용하여 파일 집합과 사용자가 제공한 확장 표현식을 한번에 한 행씩 비교한 다음 다음, 확장 정규식과 일치하는 모든 행에 작용하여 특별한 작업을 해 준다. awk 명령의 패턴 탐색은 grep 명령의 패턴 탐색보다 더 일반적이고, 입력 텍스트 행에 대해 여러 가지 조치를 실행할 수 있으며 awk 명령 프로그래밍 언어는 컴파일을 필요로 하지 않고, 변수, 수치 함수, 문자열 함수 및 논리 연산자를 사용할 수 도 있다. 보통은 sed명령과 조합하여 많이 사용하기도 한다.
기본적인 사용법은 다음과 같다.
$ awk [ -F fs ] [ -v var=value ] [ 'prog' | -f progfile ] [ file ... ]
기본형식 : awk 'patten' filename 조건
awk '{action}' filename 몇번째 필드
awk 'pattern {action}' filename 무슨 조건에 몇 번째 필드
1 (필드) 개행으로 구분한다
2 자료 처리 및 리포트 생성에 사용하는 프로그래밍 언어
3 입력 데이터로는 표준 입력, 여러 개의 파일 또는 다른 프로세스의 결과를 사용 할 수 있다
4 사용자가 지정한 패턴 검색이나 특별한 작업수행 위해 파일을 행 단위로 조사한다
5 $0은 모든 필드
설명 #
- GNU 프로젝트에서 만들어진 텍스트 처리 프로그래밍 언어이다.
- 유닉스 계열의 OS에서 사용 가능하다.
- 텍스트 형태로 되어있는 입력 데이터를 행과 단어 별로 처리해 출력한다.
- 초기 개발자 Aho, Weinberger, Kernighan의 첫글자를 따서 이름이 지어졌다.
- 기본적으로 패턴과 패턴을 처리하는 명령어 짝을 늘여놓은 구조로 이루어져 있는데, 입력으로부터 한 줄씩을 읽어서 정규 표현식으로 조건이 맞는지를 검사하고 참으로 판명되면 그 줄에 대해 명령어를 실행하는 형식이다.
- 일반적으로 다음과 같은 구조의 명령행을 사용한다.
- awk 'pattern'
- awk '{action}'
- awk 'pattern {action}'
사용법 #
$ 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
그러면 내가 원하는 형식으로 변경이 되어 사용할 수 있다.
몇 가지 사용법을 추가로 확인하면 다음과 같다.
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
첫 번째 필드가 *로 끝나지 않는 행들을 출력. 즉 종료 서열이 없는 서열을 찾을 때.
SEE ALSO #
더 자세한 내용이 필요한 경우 Texinfo 매뉴얼을 참조하면 된다. 현재 컴퓨터에 info와 awk가 정상적으로 설치되어 있다면 아래 커맨드를 입력하여 매뉴얼 내 'awk' 정보를 확인할 수 있다.
info awk
혹은 $ man awk