텍스트 자료 처리를 위한 bash 명령어2 : 텍스트 조물거리기

Bash functions to manipulate text

wc

-c(바이트 수), -m(문자수), -w(단어수), -l(라인수)

# 라인 수
wc -l your_text.txt

grep

-i(대소문자 무시), -c(결과 라인 수), -n(라인 번호 함께), -v(일치하지 않는 라인)

# 빈 라인 제거
grep -v '^$' your_text.txt > your_text_without_empty_lines.txt

tn

tr [<option>] <집합b> [<집합a>]

-c(집합b에 명시되지 않은 모든 문자), -d(집합b에 명시된 문자 삭제) -s(집합b에 명시된 문자가 연속으로 나타날 경우 하나로 축약)

파일 이름을 받지 않는다. 따라서 < 이용

# 모든 대문자를 소문자로 교체
tr 'A-Z' 'a-z' < your_text.txt

# 공백을 기준으로 개행
tr ' ' '\n' < your_text.txt

# 알파벳을 제외한 모든 문자를 기준으로 개행 (영문자에 대한 tokenizing)
tr -sc 'A-Za-z' '\n' < your_text.txt

# 연속된 공백을 하나로 합침
tr -s ' ' < your_text.txt

sort

-n(수치 정렬), -r(역순 정렬), -k start[, stop](필드를 기준으로 정렬, start에서 stop까지)

sort 명령어는 locale의 영향을 받음

# 문자열 정렬
sort your_text.txt
# 숫자 오름차순
sort -n your_text.txt
# 숫자 내림차순
sort -nr your_text.txt
# 필드 정렬
sort -k1,1 -k2,2n your_text.txt
# locale과 상관 없이 코드값에 의한 정렬을 할 때
LC_ALL=C sort your_text.txt

uniq

앞뒤 행만 비교하기 때문에 sort가 되어 있어야 전체 문서를 정리할 수 있다.

-c(출현 횟수를 함께 출력), -d(연속해서 중복된 라인만 출력), -u(중복되지 않은 라인만 출력, -d의 반대)

sort sample | uniq

cut

원하는 필드만 잘라냄

-c(선택할 문자 위치 지정), -f(필드 지정), -d(필드 구분자, 기본 구분자는 ‘\t’ )

# 1-7번째 문자 선택
cut -c 1-7 your_text.txt
# 9번째 이후 문자 선택
cut -c 9- your_text.txt
# tab으로 구분된 첫번째 필드 선택
cut -f1 your_text.txt
# tab으로 구분된 두번째 필드 선택
cut -f2 your_text.txt
# 공백으로 구분된 첫번째 필드 선택
cut -d' ' -f1 your_text.txt

paste

둘 이상의 파일의 같은 라인을 결합

-d(필드 구분자, 기본 구분자는 ‘\t’ ), -s(직렬 결합 ,가로로)

paste abc 123
# 가로로
paste -s abc 123

diff

# 두 파일 비교
diff file1 file2

응용예

# 일반적인 영문 텍스트에서 단어 토큰 빈도순으로 정리해보자
tr 'A-Z' 'a-z' < sample_text.txt | tr -sc '[A-Za-z]' '\n' | sort -i | uniq -c | sort -nr | tr -s ' ' > tmp.txt
cut -d ' ' -f2 tmp.txt > freq
cut -d ' ' -f3 tmp.txt > list
paste list freq > sample_text_token_freq.txt

# 위의 결과를 빈도순으로 정렬 (빈도가 같은 경우에는 알파벳)
sort -k2,2nr -k1,1 sample_text_token_freq.txt > sample_text_token_freq_sort.txt

REF

... ... ... ...
Back