我有一個文件:
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 的一些檢查。