bash script2023. 7. 22. 18:57

 

반달가면 이글루에서 백업 - http://bahndal.egloos.com/591729

리눅스 shell에서와 유사하게, awk에서 print 명령으로 출력할 내용을 ">" 기호를 사용하면 파일로 저장할 수 있다. 아래의 예시를 보자. 우선 my_data.txt 파일의 내용이 과일의 가격이라고 가정하자.

# my_data.txt 파일 내용 확인
cat my_data.txt
apple 500
pear 800
orange 500
strawberry 200

이 파일에서 가격이 500원인 항목만 모아서 500.txt 파일에 저장하려면, 아래와 같이 해 볼 수 있다.

# my_data.txt에서 가격이 500원인 항목만 500.txt에 저장
awk '/ 500/ { print $0 > "500.txt" }' my_data.txt

# 500.txt 파일 내용 확인
cat 500.txt
apple 500
orange 500

만약 파일을 새로 만드는 것이 아니라 기존 파일에 결과를 추가(append)하고 싶다면 print에서 ">" 대신 ">>" 기호를 사용하면 된다. 즉, shell 명령과 동일하다.

조건에 따라 파일명을 바꾸고 싶다면, awk에서 if 조건문을 사용하면 되겠다. 조건을 적용한 awk 작업에 대한 내용은 이전 게시물을 참고하자. 여기로

 

가격이 500원 이상인 항목은 ge500.txt 파일에, 500원 미만인 항목은 lt500.txt 파일에 저장하고 싶다면 아래와 같이 될 것이다.

# 500원 이상은 ge500.txt, 500원 미만은 lt500.txt 파일로 저장
awk '{
  if ($2>=500) { print $0 > "ge500.txt" }
  else if ($2<500 && $2>=0) { print $0 > "lt500.txt" }
  else { print "가격이 유효하지 않은 항목이 있습니다." }
  }' my_data.txt

# 결과 확인(500원 이상)
cat ge500.txt
apple 500
pear 800
orange 500
# 결과 확인(500원 미만)
cat lt500.txt
strawberry 200

이번에는 특정 문자열이 경계선 역할을 하고 그 경계선 문자열을 기준으로 파일을 분할하는 상황을 생각해 보자. 예를 들어 ":test[번호]:" 형태의 경계선 문자열이 있는 my_data2.txt 파일을 해당 경계선 문자열로 나누는 경우다. 아래의 예시를 보자.

# my_data2.txt 파일 내용 확인
cat my_data2.txt
:test1:
abc
def
...
:test2:
123
345
...
:test1:
aaa
bbb
...

경계선 문자열을 파일명으로 사용하여 아래와 같이 분할해 볼 수 있다.

# 경계선 문자열을 기준으로 분할
awk '/^:test[0-9]*:/ { result_filename=$0 }
  { print $0 >> result_filename }' my_data2.txt
 
위의 명령에서 변수 result_filename의 값이 갱신되는 부분것은 경계선 패턴이 등장할 때만 이루어지고 그 아래의 print 명령은 패턴 조건이 없으므로 입력 받은 모든 행에 대해서 이루어진다.

#결과 확인
cat :test1:
:test1:
abc
def
...
:test1:
aaa
bbb
...
cat :test2:
:test2:
123
345
...

크기가 큰 하나의 파일을 조건에 따라 여러 파일로 분할하고 싶을 때 아주 요긴하다.

 

728x90
Posted by 반달가면