특정 단어를 기반으로 파일 덤프

특정 단어를 기반으로 파일 덤프

파일이 있습니다:

begin  
path: good  
take this way  
easier path
end  

begin  
path: bad  
You shouldn't go there  
end

begin  
path: good  
Very smooth   
end

begin  
path: bad  
you may face problem  
end  

경로를 기반으로 파일을 만들어야 합니다.

확인.txt

begin  
path: good  
take this way
easier path 
end 

begin  
path: good  
Very smooth   
end

unix이와 같은 명령을 사용하는 것이 가능합니까 grep awk sed sort?

답변1

가장 간단하게 "경로" 레코드의 형식이 표시된 것과 똑같다고 가정하면 다음을 awk사용할 수 있습니다.단락 모드

awk '{print > $3".txt"}' RS= ORS='\n\n' file

답변2

Linux에서 사용할 수 있는 다양한 도구가 있습니다.

  • sh|bash|ksh|csh- 또는 다른 쉘
  • awk
  • perl
  • python(설치에 따라 다름)

또는 위 도구의 조합.

bash및 를 사용하는 가능한 솔루션은 sed제한 사항/가정에 대한 참고 사항을 참조하세요.

#!/bin/bash
IN_FILE="$1"   ## Argument: test.txt
OUT_FILE=

# See done for
while read LINE
do
    case $LINE in
        begin)
            OUT_FILE=
            ;;

        path:*)
            OUT_FILE=$(echo "$LINE" | sed 's/^path: \(.*\)/\1/g').txt
            ## TODO: Do a first-seen OUT_FILE check and truncate file.
            echo "begin" >> "$OUT_FILE"   # TODO: Write from buffer instead
            echo "$LINE" >> "$OUT_FILE"
            ;;

        *)
            if [ ! -z "$OUT_FILE" ]
            then
                echo "$LINE" >> "$OUT_FILE"
            else
                ## TODO: Append to a buffer
            fi
           ;;
    esac
done < "$IN_FILE"

노트: 위의 코드는 예상되는 출력을 생성하지만 로직이 완전하고 버그가 없는지 확인하기 위해 검토하지 않았습니다.

또한 다음과 같은 제한 사항과 문제점이 있습니다.

  • .txt파일이 이미 존재하더라도 파일에 추가됩니다(요청 시 고유성 검사를 추가할 수 있음).
  • lookahead 를 가정 begin하면 path:..입력에서 해당 줄을 무시하고 해당 줄을 발견하면 경로를 쓸 수 있습니다. 변수 를 생성하는 것은 가능 BUFFER하지만 아직 해본 적이 없습니다.
  • 빈 OUT_FILE 에 대한 일부 검사가 누락되었을 수 있습니다.

관련 정보