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