
ファイルがあります:
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 のチェックがいくつか欠落している可能性があります。