Awk를 자주 쓰게 되는 건 쉘상에서 데이터 조작이 필요 할 경우 입니다. (물론 awk, sed, grep 등등 조합으로 쓰기도 하지만)
히스토리는 관련 검색을 하면 많이 나오므로, 실무에서 사용 가능한 부분만 정리합니다.
알아야 할 단축어
FS |
필드 분리자 |
awk -f "FS" |
|
인쇄명령 (화면 출력) |
Awk '{print $0}' |
printf |
Print 확장 (깔끔한 출력?) - 여타 다른 언어와 마찬가지로 char=c, int=d 제공 |
echo "awk" |awk '{printf "|%-15s|\n",$1}' echo "awk" |awk '{printf "|%15s|\n",$1}' |
OFMT |
숫자 포맷 제어 (output format) : default %.6g (소수점 6자리 혹은 위로 6자리) |
|
NR |
레코드 번호 |
awk '{print NR" "$0}' |
NF |
현재 레코드에서 전체 필드 수 |
awk '{print NF}' |
FNR |
현재 파일의 전체 레코드 수 |
Awk '{print FNR}' |
IGNORECASE |
대소 무시 |
Awk -F: "{IGNORECASE=1}" |
사용방법
#>awk 'pattern' filename'
샘플 파일 (1.txt)
Kim 123 11/1/2 333
Wang 321 33/2/12 222
1Kim 222 33/11/33 333
- Awk 기본 구분자
Tab 문자열 혹은 공백입니다.
예제 > awk 1.txt '{print $1}'
Kim
Wang
Kim |
123 |
11/1/2 |
333 |
Wang |
321 |
33/2/12 |
222 |
$1 |
$2 |
$3 |
$4 |
위 처럼 컬럼이 나눠져 들어갑니다.
- 특정 패턴을 구분자로 할 경우
예제 > awk -F"/" 1.txt '{print $1}'
Kim 123 11
Wang 321 33
Kim 123 11 |
1 |
2 333 |
Wang 321 33 |
2 |
12 222 |
$1 |
$2 |
$3 |
시스템 명령어 조합으로 사용하기 ( | :파이프라인을 사용)
예제 > df|awk '{print $6}'
Mounted
/
/dev/shm
/data
/home
df 정보가 아래 처럼 나오는데 여기서 탭 문자열을 구분해 $6번째 컬럼을 보여주는 예제입니다.
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda1 28898428 2552004 24878472 10% /
tmpfs 1027296 0 1027296 0% /dev/shm
/dev/sda3 10321208 3427544 6369376 35% /data
/dev/sda2 61927420 42257352 16524340 72% /home
====================================================================
Awk는 라인단위로 읽어 $0라는 내부변수에 담습니다. ( awk '{print $0' filename 시 라인 전체 출력)
awk -f 사용법
awk -f (awk명령어 파일) filename
예제> awk.run
{print $1" Hello~~~~"}
{print $1 $2}
실행 > awk -f awk.run 1.txt
awk -f awk.run 1.txt
Kim Hello~~~~
Kim123
Wang Hello~~~~
Wang321
한 라인에 대해 예제의 awk.run 파일을 적용하여 나타나도록 합니다.
grep 명령어 대용으로 awk 사용
예제> awk '/Kim/ {print $1 " :" NR}' x
Kim :1
/ / 부분은 정규식 표현이 가능하다
예제> awk '/^[K1]/ {print $1 " :" NR}' 1.txt
Kim :1
1Kim :3
예제 > awk '/Wang/,/1Kim/ {print $0}' 1.txt
Wang 321 33/2/12 222
1Kim 222 33/11/33 333
Awk 필드 매치 (~)
예제> awk '$1~/Kim/{print $0 ":" NR}' 1.txt
Kim 123 11/1/2 333:1
1Kim 222 33/11/33 333:3
$1필드에서 Kim이 포함된 라인전체와 줄번호 출력
예제> awk '$1!~/Kim/{print $0 ":" NR}' 1.txt
Wang 321 33/2/12 222:2
$1필드에서 Kim이 들어가 있지 않은 라인 전체와 줄번호 출력
비교연산 (클까? 작을까? 같을까? 아니면 정규표현식?은 위에 필드 매치 ~ 참조)
예제 >awk '$2 > 200' 1.txt
Wang 321 33/2/12 222
1Kim 222 33/11/33 333
If문
usage: (A ? B : C;)
{
if ($1 > $2)
x=$1
else
x=$2
}
예제> awk '{x=($2 > $4) ? $2 : $4; print x}' 1.txt
333
321
333
- $2번과 $4필드값을 비교
- $2 필드가 $4보다 크면
- 물음표 뒤 ? $2값을 x에 할당
- 그렇지 않으면 : 뒤의 $4값을 x 할당
특정 컬럼 전체 SUM하기
예제> awk '{sum+=$2} END {print sum}' 1.txt
특정 컬럼끼리 SUM하기
예제> awk '{sum=$2+$4; print sum}' 1.txt
Awk에서 특정 변수 선언해서 사용하기
예제> awk1.run (파일생성)
{print $var}
awk -f awk1.run -v var=2 1.txt
123
321
222
아직은 기초입니다...기초..=_=;;Awk를 자주 쓰게 되는 건 쉘상에서 데이터 조작이 필요 할 경우 입니다. (물론 awk, sed, grep 등등 조합으로 쓰기도 하지만)
히스토리는 관련 검색을 하면 많이 나오므로, 실무에서 사용 가능한 부분만 정리합니다.
알아야 할 단축어
FS |
필드 분리자 |
awk -f "FS" |
|
인쇄명령 (화면 출력) |
Awk '{print $0}' |
printf |
Print 확장 (깔끔한 출력?) - 여타 다른 언어와 마찬가지로 char=c, int=d 제공 |
echo "awk" |awk '{printf "|%-15s|\n",$1}' echo "awk" |awk '{printf "|%15s|\n",$1}' |
OFMT |
숫자 포맷 제어 (output format) : default %.6g (소수점 6자리 혹은 위로 6자리) |
|
NR |
레코드 번호 |
awk '{print NR" "$0}' |
NF |
현재 레코드에서 전체 필드 수 |
awk '{print NF}' |
FNR |
현재 파일의 전체 레코드 수 |
Awk '{print FNR}' |
IGNORECASE |
대소 무시 |
Awk -F: "{IGNORECASE=1}" |
사용방법
#>awk 'pattern' filename'
샘플 파일 (1.txt)
Kim 123 11/1/2 333
Wang 321 33/2/12 222
1Kim 222 33/11/33 333
- Awk 기본 구분자
Tab 문자열 혹은 공백입니다.
예제 > awk 1.txt '{print $1}'
Kim
Wang
Kim |
123 |
11/1/2 |
333 |
Wang |
321 |
33/2/12 |
222 |
$1 |
$2 |
$3 |
$4 |
위 처럼 컬럼이 나눠져 들어갑니다.
- 특정 패턴을 구분자로 할 경우
예제 > awk -F"/" 1.txt '{print $1}'
Kim 123 11
Wang 321 33
Kim 123 11 |
1 |
2 333 |
Wang 321 33 |
2 |
12 222 |
$1 |
$2 |
$3 |
시스템 명령어 조합으로 사용하기 ( | :파이프라인을 사용)
예제 > df|awk '{print $6}'
Mounted
/
/dev/shm
/data
/home
df 정보가 아래 처럼 나오는데 여기서 탭 문자열을 구분해 $6번째 컬럼을 보여주는 예제입니다.
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda1 28898428 2552004 24878472 10% /
tmpfs 1027296 0 1027296 0% /dev/shm
/dev/sda3 10321208 3427544 6369376 35% /data
/dev/sda2 61927420 42257352 16524340 72% /home
====================================================================
Awk는 라인단위로 읽어 $0라는 내부변수에 담습니다. ( awk '{print $0' filename 시 라인 전체 출력)
awk -f 사용법
awk -f (awk명령어 파일) filename
예제> awk.run
{print $1" Hello~~~~"}
{print $1 $2}
실행 > awk -f awk.run 1.txt
awk -f awk.run 1.txt
Kim Hello~~~~
Kim123
Wang Hello~~~~
Wang321
한 라인에 대해 예제의 awk.run 파일을 적용하여 나타나도록 합니다.
grep 명령어 대용으로 awk 사용
예제> awk '/Kim/ {print $1 " :" NR}' x
Kim :1
/ / 부분은 정규식 표현이 가능하다
예제> awk '/^[K1]/ {print $1 " :" NR}' 1.txt
Kim :1
1Kim :3
예제 > awk '/Wang/,/1Kim/ {print $0}' 1.txt
Wang 321 33/2/12 222
1Kim 222 33/11/33 333
Awk 필드 매치 (~)
예제> awk '$1~/Kim/{print $0 ":" NR}' 1.txt
Kim 123 11/1/2 333:1
1Kim 222 33/11/33 333:3
$1필드에서 Kim이 포함된 라인전체와 줄번호 출력
예제> awk '$1!~/Kim/{print $0 ":" NR}' 1.txt
Wang 321 33/2/12 222:2
$1필드에서 Kim이 들어가 있지 않은 라인 전체와 줄번호 출력
비교연산 (클까? 작을까? 같을까? 아니면 정규표현식?은 위에 필드 매치 ~ 참조)
예제 >awk '$2 > 200' 1.txt
Wang 321 33/2/12 222
1Kim 222 33/11/33 333
If문
usage: (A ? B : C;)
{
if ($1 > $2)
x=$1
else
x=$2
}
예제> awk '{x=($2 > $4) ? $2 : $4; print x}' 1.txt
333
321
333
- $2번과 $4필드값을 비교
- $2 필드가 $4보다 크면
- 물음표 뒤 ? $2값을 x에 할당
- 그렇지 않으면 : 뒤의 $4값을 x 할당
특정 컬럼 전체 SUM하기
예제> awk '{sum+=$2} END {print sum}' 1.txt
특정 컬럼끼리 SUM하기
예제> awk '{sum=$2+$4; print sum}' 1.txt
Awk에서 특정 변수 선언해서 사용하기
예제> awk1.run (파일생성)
{print $var}
awk -f awk1.run -v var=2 1.txt
123
321
222
'01. operation > iii. Shell Script' 카테고리의 다른 글
awk로 합계를 뽑아내보자. (0) | 2009.07.27 |
---|---|
문자열 변경 (0) | 2009.07.27 |