일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 의사결정나무
- git 기본명령어
- 데이터 분석
- airflow 정리
- SQL
- Spark jdbc parallel read
- Spark 튜닝
- 데이터분석
- Python
- 앙상블
- Decision Tree
- 오라클 데이터 처리방식
- 배깅
- git stash
- Oracle ASSM
- Linux
- CF
- 알고리즘
- Spark Data Read
- 네트워크
- eda
- 추천시스템
- 통계분석
- git init
- enq: FB - contention
- 랜덤포레스트
- 리눅스 환경변수
- Collaborative filtering
- Oracle 논리적 저장 구조
- BFS
- Today
- Total
[Alex] 데이터 장인의 블로그
[Linux] 데이터 엔지니어링을 위한 awk 명령어 정리 본문
awk 명령어
awk는 리눅스의 파일 및 데이터를 조작하고(1), 리포트를 생성(2)하기 위해 사용하는 언어입니다.
기본명령어부터 정리하겠습니다.
기본 사용법
ex) 파일 상태 (vi)
alex 데이터분석가 20200104
ALEX 데이터엔지니어 20200131
awk '{print $0}' [파일이름] -> 전체 추출
alex 데이터분석가 20200104
ALEX 데이터엔지니어 20200131
awk '{print $1}' [파일이름] -> 첫번째 단어 추출 $1 부터 시작
alex
ALEX
awk '{print $2}' [파일이름] -> 두번째 단어 추출
데이터분석가
데이터엔지니어
awk '{print NR}' [파일이름] -> 파일레코드 출력
1
2
awk '/20200104/' [파일이름] -> 해당 문자열이 포함된 전체 로우 출력
alex 데이터분석가 20200104
awk '/20200104/{print '\t안녕, 난 '$1, $2'에요' [파일이름]
-> /해당문자열/이 있는 로우를 찾고 그 해당 로우를 조건에 맞게 변형하여 출력
안녕, 난 alex, 데이터분석가에요
여기까지 간단한 awk 사용법 정리였습니다.
OFMT, printf 변수
awk 'BEGIN{OFMT="%.2f"; print 1.23412, 15E-3}'
-> OFMT 변수를 통해서 숫자 포맷을 제어.
1.23 0.01
awk '{printf "저는 %-20s 입사일은 %10d입니다.\n", $1"("$2")", $3}' awkfile
저는 alex(데이터분석가) 입사일은 20200104입니다.
저는 ALEX(데이터엔지니어) 입사일은 20200131입니다.
- s : 문자열(붙여서 사용가능), c : 문자, d : 10진수, f : 실수, x : 16진수
- %20s, %10d 각 소문자 앞에 숫자는 공백 숫자를 나타낸 것.
- -는 왼쪽으로 정렬하여 오른쪽 공백, 보통은 왼쪽부터 공백
파이프라인 활용 awk 사용법 ( | ) 사용
df -h | awk '$4 > 10' -> 사용 가능한 용량이 10G 이상인 저장소를 나타냄
Filesystem Size Used Avail Use% Mounted on
udev 63G 0 63G 0% /dev
tmpfs 13G 2.7M 13G 1% /run
/dev/sdb2 453G 408G 22G 95% /
tmpfs 63G 40K 63G 1% /dev/shm
tmpfs 5.0M 4.0K 5.0M 1% /run/lock
tmpfs 63G 0 63G 0% /sys/fs/cgroup
/dev/sdb1 511M 6.1M 505M 2% /boot/efi
tmpfs 13G 40K 13G 1% /run/user/1003
tmpfs 13G 40K 13G 1% /run/user/1005
Available 용량이 4번째에 나타내고 있으니 $4을 소환하여 비교문을 설정.
awk -f 옵션
$ vi awkcmd
{printf "저는 %-20s 입사일은 %10d입니다.\n", $1"("$2")", $3}
실행방법
awk -f awkcmd awkfile
필드분리자 ( FS )
빌트인 변수 FS는 입력 필드 분리자의 값을 가지고 있음.
default는 공백과 탭.
FS 값을 변경하기 위해선 -F을 사용하며 -F 다음에 오는 문자가 새로운 필드 분리자가 됨
$ vi awkfile_FS
피카츄:디자이너 2021-05
라이언:개발자 2021-06
$ awk -F: '/피/{print $1, $2}' awkfile
피카츄 디자이너 2021-05
$ awk -F'[ :\t]' '/피/{print $1,$2}' awkfile
피카츄 디자이너
-F 뒤에 구분자를 입력 (':' or '[ :\t]')하여 분리자 설정.
비교 표현식
조건 표현식
$ awk '{max={$1 > $2) ? $1 : $2; print max}' filename
if $1 > $2:
max = $1
else:
max = $2
논리 연산자
- && : AND 연산
- || : OR 연산
- ! : NOT 연산
$ awk '$3 > $5 && $3 <= 100' filename
정규표현식 사용방법
awk '/ [정규표현식 입력] /' awkfile2
# ex) 영어 정규표현식 활용 추출
$ awk '/^[A-Z][a-z]+ /' awkfile2
> Hong KilgDong 3324 5/11/96 50354
# ex) : 2번 필드가 g로 끝나지 않는 라인 출력
$ awk '$2 !~ /g$/' awkfile2
> Lee Seongkye 7654 6/20/58 60000
리다이렉션
awk 결과를 리눅스 파일로 리다이렉션할 경우 쉘 리다이렉션 연산자 사용.
파일명은 큰따옴표로 표현
> 심볼이 사용될 때 파일이 오픈, 잘려짐.
$ awk -F: '$4 >= 60000 {print $1, $2 > "new_file"}' awkfile5
'Linux&OS' 카테고리의 다른 글
[Linux] Bash 쉘스크립트 사용법 정리 (0) | 2021.12.12 |
---|---|
[Linux] 데이터 엔지니어링을 위한 sed, xargs, nohup, scp 기본 명령어 정리 (0) | 2021.12.11 |
[Server] WAS 서버와 웹서버의 차이 (0) | 2021.12.02 |
[Jupyter] 여러개 가상환경 커널 사용시, pip 경로 지정 (0) | 2021.11.07 |
[Linux] 시스템 부팅시 환경변수 자동 등록 (0) | 2021.08.31 |