파일이 있습니다:
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 에 대한 일부 검사가 누락되었을 수 있습니다.