連続した段落のグループの並べ替え(空行で区切られます)?

連続した段落のグループの並べ替え(空行で区切られます)?

私の考えは今分類にかなり上手になったようです。リスト;しかし、これまでソート方法に関する情報が見つかりませんでした。連続線

次のテキストファイルがあるとしましょう。 (もちろんとても簡単です。)

Echo
Alpha
Delta
Charlie

Golf
Bravo
Hotel
Foxtrot

これで、英数字で行を並べ替えることができますか?各ブロックは別々に?つまり、結果は次のようになります。

Alpha
Charlie
Delta
Echo

Bravo
Foxtrot
Golf
Hotel

sortマニュアルページで見つけた内容によれば、sort組み込みのUNIXコマンドを使用すると、これは不可能かもしれません。または、外部/サードパーティ製のツールを使用せずに実行できますか?

ベストアンサー1

awk -v RS= -v cmd=sort '{print | cmd; close(cmd); print ""}' file

レコード区切り文字をRS空の文字列に設定すると、awkは一度に段落を段階的に実行します。各段落に対して、段落()をcmd(に設定)に$0パイプし、sort出力を印刷します。に出力段落を区切るために空白行を印刷しますprint ""

Perlの例を挙げると、私はStephaneのアプローチとは異なるアプローチを提案します。

perl -e 'undef $/; print join "\n", sort (split /\n/), "\n" 
    foreach(split(/\n\n/, <>))' < file

完全なSTDINをundef $/使用してインポートできるようにするフィールド区切り記号()を設定解除します。<>その後(段落)にsplit戻ります。 「段落」:改行の周りに行を設定し、再度集めて最後に追加します。\n\nforeachsortsplitsortjoin\n

ただし、これは前の段落にない場合、最後の段落に「末尾の段落」区切り文字を追加する副作用があります。少し美しい方法でこの問題を解決できます。

perl -e 'undef $/; print join "\n", sort (split /\n/) , (\$_ == \$list[-1] ? "" : "\n")
    foreach(@list = split(/\n\n/, <>))' < file

これは段落を割り当て、それが(チェック)の最後の要素である@listことを確認するための「三項演算」を持ちます。 ()の場合は印刷し、そうでない場合は()他のすべての「段落」(の要素)を印刷します。foreach\$_ == \$list[-1]""? ...: ..."\n"@list

おすすめ記事