特定の単語に基づくファイルダンプ

特定の単語に基づくファイルダンプ

ファイルがあります:

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のいくつかのチェックがありません。

関連情報