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

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

파일이 있습니다:

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파일이 이미 존재하더라도 파일 에 추가됩니다 (요청 시 고유성 검사를 추가할 수 있음).
  • begin선행 항목을 가정하므로 path:..입력에서 해당 행을 무시하고 경로가 발견될 때 이를 쓸 수 있습니다. 변수를 생성하는 것이 가능 BUFFER하지만 지금은 그렇게 하지 않았습니다.
  • 빈 OUT_FILE에 대한 일부 검사가 누락되었을 수 있습니다.

관련 정보