特定の単語に基づいてファイルをダンプする

特定の単語に基づいてファイルをダンプする

ファイルがあります:

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ファイルがすでに存在する場合でもファイルに追加します(リクエストに応じて一意性チェックを追加できます)
  • beginが先行していると想定しpath:..、入力からのその行を無視して、パスに遭遇したときに書き出すことができます。変数を作成することもできますBUFFERが、現時点では作成していません。
  • 空の OUT_FILE のチェックがいくつか欠落している可能性があります。

関連情報