私の考えは今分類にかなり上手になったようです。リスト;しかし、これまでソート方法に関する情報が見つかりませんでした。連続線。
次のテキストファイルがあるとしましょう。 (もちろんとても簡単です。)
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\n
foreach
sort
split
sort
join
\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