줄 시작 패턴을 기반으로 텍스트 파일을 여러 파일로 분할하는 방법은 무엇입니까?

줄 시작 패턴을 기반으로 텍스트 파일을 여러 파일로 분할하는 방법은 무엇입니까?

각 줄의 시작 부분에 넣은 임의의 "태그"를 기반으로 여러 파일로 분할하려는 일부 텍스트 파일이 있습니다.

텍스트 파일 예:

I CELEBRATE myself, and sing myself,  
And what I assume you shall assume, 
For every atom belonging to me as good belongs to you.

#here I loafe and invite my soul, 
#here I lean and loafe at my ease observing a spear of summer grass.

#there My tongue, every atom of my blood, form'd from this soil, this air,
#there Born here of parents born here from parents the same, and their parents the same, 
#here I, now thirty-seven years old in perfect health begin, 
#here Hoping to cease not till death.

이 예에서는 로 시작하는 모든 줄을 제거 #here하고 이라는 파일에 추가하고 로 here.txt시작하는 모든 줄을 #there이라는 파일에 추가 there.txt하고 표시되지 않은 모든 줄을 원본 파일에 유지하려고 합니다. ( #here #there이 과정에서 태그를 제거하는 것이 가장 좋습니다 .)

다음을 사용하는 이 솔루션이 도움이 될 것이라고 생각 awk하지만 저는 Unix 초보 사용자이고 이를 제 문제에 적용하는 방법을 모르겠습니다.키워드 경계를 사용하여 파일을 분할하는 방법

진행 방법에 대한 제안이 있으십니까?

추신: 저는 OS X에서 명령줄을 사용하고 있습니다.

답변1

귀하의 사례는 링크된 사례보다 간단합니다. 각 줄을 보고(또는 awk 용어로 "기록") 어디로 보낼지 결정하면 됩니다. 그래서:

awk '/^#here/{print > "here.txt"; next} /^#there/{print > "there.txt"; next} {print}' input.txt

나머지 줄은 표준 출력으로 인쇄됩니다. 이식 가능한 경우 이를 세 번째 파일( rest.txt예:)로 리디렉션한 다음 이름을 원본 파일 이름으로 바꿀 수 있습니다. GNU awk가 있는 경우 이 inplace모듈을 사용하여 원본 파일을 직접 수정할 수 있습니다.

gawk -i inplace '/^#here/{print > "here.txt"; next} /^#there/{print > "there.txt"; next} {print}' input.txt

답변2

사용 sed w명령:

sed -n -e '/^#here/w here.txt' -e '/^#there/w there.txt' data

원하는 패턴으로 시작하지 않는 줄을 유지하려면 다음을 수행하세요.

sed -n -e '/^#here/w here.txt' -e '/^#there/w there.txt' -e '/^$/d;' -e '/^#/!w new_data.txt' data

그러면 sed일치 항목이 해당 줄에 적용되고 해당 파일에 기록됩니다.

행이 표시되지 /^#/!않고( ) 비어 있지 않은 경우( /^$/) 해당 행은 표시되지 않은 모든 행을 포함하는 이름의 파일에 기록됩니다 new_data.txt.

빈 줄을 유지하려면 -e /^$/d;명령줄에서 제거하세요.

관련 정보