根據特定單字轉儲文件

根據特定單字轉儲文件

我有一個文件:

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(取決於它的安裝)

或上述工具的任意組合。

可能的解決方案使用bashsed,請參閱有關限制/假設的註釋:

#!/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即使檔案已經存在,也會追加到文件中(可以根據要求添加唯一性檢查)
  • 假設先行beginpath:..因此可以忽略輸入中的該行並在遇到路徑時將其寫出。可以創建一個BUFFER變量,但我目前還沒有這樣做。
  • 它可能缺少對空白 OUT_FILE 的一些檢查。

相關內容