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