![줄 시작 패턴을 기반으로 텍스트 파일을 여러 파일로 분할하는 방법은 무엇입니까?](https://linux55.com/image/15428/%EC%A4%84%20%EC%8B%9C%EC%9E%91%20%ED%8C%A8%ED%84%B4%EC%9D%84%20%EA%B8%B0%EB%B0%98%EC%9C%BC%EB%A1%9C%20%ED%85%8D%EC%8A%A4%ED%8A%B8%20%ED%8C%8C%EC%9D%BC%EC%9D%84%20%EC%97%AC%EB%9F%AC%20%ED%8C%8C%EC%9D%BC%EB%A1%9C%20%EB%B6%84%ED%95%A0%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
각 줄의 시작 부분에 넣은 임의의 "태그"를 기반으로 여러 파일로 분할하려는 일부 텍스트 파일이 있습니다.
텍스트 파일 예:
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;
명령줄에서 제거하세요.