이 간단한 플랫 파일(file.txt)이 있습니다.
a43
test1
abc
cvb
bnm
test2
test1
def
ijk
xyz
test2
kfo
test1과 test2 사이의 모든 줄이 두 가지 형식으로 필요합니다. 첫 번째 줄은 다음과 같은 두 개의 새 파일을 만듭니다.
새파일1.txt:
test1
abc
cvb
bnm
test2
새파일2.txt
test1
def
ijk
xyz
test2
두 번째 형식은 다음과 같은 하나의 새 파일만 만듭니다.
새파일.txt
test1abccvbbnmtest2
test1abccvbbnmtest2
제안사항이 있나요?
두 번째 형태의 경우. 나는 이것을 사용했다
sed -n '/test1/,/test2/p' file.txt > newfile.txt
하지만 그것은 나에게 다음과 같은 결과를 제공합니다
test1abccvbbnmtest2test1abccvbbnmtest2
다음과 같은 반환 라인이 필요합니다.
test1abccvbbnmtest2
test1abccvbbnmtest2
답변1
첫 번째 경우에 대한 awk oneliner :
awk '/^test1/{file++; on=1} on{print >("newfile" file ".txt")} /^test2/{on=0}' file.txt
이는 다음과 같이 말합니다.
- 발견 되면
test1
파일 번호를 증가시키고 출력을 시작합니다(예: Turnon
). - 켜져 있으면 파일 이름 "newfileFILE.txt"에 대한 행을 인쇄합니다. 여기서 FILE은 파일 번호입니다.
- 발견 되면
test2
출력을 종료합니다(즉, 끄기).
newfile.txt
그런 다음 쉘 oneliner를 사용하여 두 파일을 변환할 수 있습니다 .
for file in newfile?.txt; do tr -d '\n' <$file; echo; done > newfile.txt
즉, foreach 파일은 모든 줄 바꿈을 제거합니다.
답변2
두 번째 양식의 경우:
sed -n '/test1/,/test2/p' file.txt | xargs > newfile.txt ; sed 's/test2/&\n/g' newfile.txt | sed -e 's/^[ \t]*//'
- sed -n '/test1/,/test2/p' file.txt --> test1과 test2 사이의 텍스트 캡처
- xargs > newfile.txt --> 효과적으로 말하면 텍스트를 "행"으로 변환하지만 xargs의 목적은 다를 수 있습니다.
- sed 's/test2/&\n/g' newfile.txt --> "test2" 패턴 뒤에 줄바꿈 추가
- sed -e 's/^[ \t]*//' --> 각 줄의 시작 부분에서 공백을 삭제합니다.