100문제로 두드려 보는 자연어처리(제2장, UNIX 명령어)


출처 : nlp100


제2장 : UNIX 명령

popular-names.txt는 미국에서 태어난 아기의 “이름”,”성별”,”인원수”,”나이” 데이터를 탭을 구분자로 사용, 저장한 파일이다. 아래와 같이 처리할 프로그램을 작성하고, popular-names.txt를 입력 파일로도 실행하시오. 또한, 동일한 동작이 UNIX 명령어로도 가능한지 실행하여 확인하시오.

10. 몇 줄짜리 파일

  • 파일이 몇 줄인지 구하시오. 확인을 위해서 wc 명령어를 사용하시오.
> wc -l popular-names.txt
#     2780   11120   55026 popular-names.txt

11. 탭을 공백으로 변환

  • 모든 탭을 공백 문자로 변환하시오. 확인을 위해 sed 명령어, tr 명령어, expand 명령어를 사용하시오.
# 수정 전
> head -n 5 popular-names.txt
# Mary		F	7065	1880
# Anna		F	2604	1880
# Emma		F	2003	1880
# Elizabeth		F	1939	1880
# Minnie	F	1746	1880
> expand -t 1 popular-names.txt > ret.txt
> head -n 5 ret.txt
# 수정 후
# Mary F 7065 1880
# Anna F 2604 1880
# Emma F 2003 1880
# Elizabeth F 1939 1880
# Minnie F 1746 1880

12. 첫번째 열을 col1.txt에, 두번째 열을 col2.txt에 저장

  • 각 행의 첫번째 열을 추출하여 col1.txt에, 두번째 열을 추출하여 col2.txt에 각각 저장하시오. 확인을 위해 cut 명령을 사용하시오.
> cut -f 1 popular-names.txt > col1.txt
> head -n 5 col1.txt
# Mary
# Anna
# Emma
# Elizabeth
# Minnie
> cut -f 2 popular-names.txt > col2.txt
> head -n 5 col2.txt
# F
# F
# F
# F
# F

13. col1.txt와 col2.txt를 병합

  • 12번 문제에서 만든 col1.txt와 col2.txt를 병합하고, 원래 파일의 1열과 2열을 탭으로 구분하여 텍스트 파일에 저장하시오. 확인을 위해 paste 명령을 사용하시오.
> paste -d \\t col1.txt col2.txt > output.txt
> head -n 5 output.txt
# Mary		F
# Anna		F
# Emma		F
# Elizabeth		F
# Minnie	F

14. 앞에서부터 N행을 출력

  • 자연수 N을 명령 인자로 받아, 입력 파일에서 앞에서부터 N행만 표시하시오. 확인을 위해 head 명령을 사용하시오.
> vim print_head.sh
	# print_head.sh 내용 입력
	echo "출력할 행 수(숫자) 입력"
	read num # 직전 echo로 받은 변수 저장
	echo "출력할 파일명(확장자 포함) 입력"
	read files
	head -n $num $files
> sh print_head.sh
# 출력할 행 수(숫자) 입력
> 7
# 출력할 파일명(확장자 포함) 입력
> output.txt
# Mary		F
# Anna		F
# Emma		F
# Elizabeth		F
# Minnie	F
# Margaret		F
# Ida		F

15. 뒤에서부터 N행을 출력

  • 자연수 N을 명령 인자로 받아, 입력 파일에서 뒤에서부터 N행만 표시하시오. 확인을 위해 tail 명령을 사용하시오.
> vim print_tail.sh
	# print_tail.sh 내용 입력
	echo "출력할 행 수(숫자) 입력"
	read num
	echo "출력할 파일명(확장자 포함) 입력"
	read files
	tail -n $num $files
> sh print_tail.sh
# 출력할 행 수(숫자) 입력
> 5
# 출력할 파일명(확장자 포함) 입력
> output.txt
# Benjamin		M
# Elijah	M
# Lucas		M
# Mason		M
# Logan		M

16. 파일을 N분할

  • 자연수 N을 명령 인자로 받아, 입력 파일을 행 단위로 N 분할하시오. 확인을 위해 split 명령을 사용하시오.
> vim splits.sh
	# splits.sh 내용 입력
	echo "분할할 갯수(숫자) 입력"
	read splitNum
	echo "분할할 파일명(확장자 포함) 입력"
	read files
	lines=`echo "$(wc -l < $files)+$splitNum-1"|bc` # files의 줄 수를 임의 변수로 받고, splitNum을 더하고 1을 뺌(files의 줄 수만을 받게 되면 추후 나눗셈을 하고나면 나머지값이 마지막 파일로 들어가게 됨. 이를 방지하기 위함)
	div=`expr $lines / $splitNum` # 나눗셈 연산
	split -l $div $files outputfile_ # split을 line수를 기반으로 함. split -l (줄수) (나눌파일명) (나누어저장할파일명)
> sh splits.sh
# 분할할 갯수(숫자) 입력
> 3
# 분할할 파일명(확장자 포함) 입력
> output.txt
> ls
# -rw-r--r--   1 junhokim  staff   8.0K  8 10 20:32 outputfile_aa
# -rw-r--r--   1 junhokim  staff   8.0K  8 10 20:32 outputfile_ab
# -rw-r--r--   1 junhokim  staff   8.5K  8 10 20:32 outputfile_ac

17. 1열 고유 문자열

  • 1열의 고유 문자열을 구하시오. 확인을 위해 cut, sort, uniq 명령을 사용하시오.
> cut -f 1 popular-names.txt | sort | uniq # sort로 알파벳 순서로 정렬 | uniq 중복된 문자열을 제거
# head 10줄 만 확인하면
# Abigail
# Aiden
# Alexander
# Alexis
# Alice
# Amanda
# Amelia
# Amy
# Andrew
# Angela

18. 각 행을 3열의 수치 내림차순으로 정렬

  • 각 행을 3열의 값 역순으로 정렬하시오. (주: 각 행의 내용은 변경하지 않고 정렬). 확인을 위해서 sort 명령을 사용하시오. (이 문제는 명령어로 실행했을 때와의 결과가 완전히 일치하지 않아도 됩니다.)
> cat popular-names.txt | sort -r -k 3 -n # -r 역순정렬, -k 3 정렬할 열(3열), -n 숫자로 해석해 값의 크기로 정렬

19. 각 행의 1열째의 문자열의 출현빈도를 기준으로, 출현빈도가 높은 순서대로 나열

  • 각 행의 1열 문자열의 출현 빈도를 구하고, 높은 순서대로 나열하여 표시하시오. 확인을 위해 cut, uniq, sort 명령을 사용하시오.
> cut -f 1 popular-names.txt | sort | uniq -c | sort -r # sort로 알파벳 순서로 정렬 | uniq -c 중복된 문자열을 제거, -c 는 반복된 횟수 카운트 | sort -r 출현빈도 역순정렬
# head 10줄 만 확인하면
# 중복수 고유문자열
# 118 James
# 111 William
# 108 Robert
# 108 John
#  92 Mary
#  75 Charles
#  74 Michael
#  73 Elizabeth
#  70 Joseph
#  60 Margaret
August 10, 2020 에 작성
Tags: nlp shell unix