awk -v RS= -v cmd=sort '{print | cmd; close(cmd); print ""}' file
レコードセパレータRS
を空の文字列に設定すると、一度に段落のawkステップが実行されます。各段落について、段落を($0
)でcmd(これはに設定されていますsort
)にパイプし、出力を印刷します。空白行を印刷して、出力段落をで区切りprint ""
ます。
perlの例を挙げている場合は、Stephaneのアプローチとは別のアプローチを示します。
perl -e 'undef $/; print join "\n", sort (split /\n/), "\n"
foreach(split(/\n\n/, <>))' < file
フィールド区切り記号(undef $/
)<>
を設定解除すると、STDIN全体を使用および取得できます。私たちはsplit
それから\n\n
(段落)。foreach
「段落」、sort
によって行split
改行周りティン、sort
INGの、その後join
一緒に戻ってそれらをINGのと後ろにタック\n
。
ただし、これには、最後の段落に「末尾の段落」区切り文字が追加されるという副作用があります(前にない場合)。あなたは少しかわいくないでそれを回避することができます:
perl -e 'undef $/; print join "\n", sort (split /\n/) , (\$_ == \$list[-1] ? "" : "\n")
foreach(@list = split(/\n\n/, <>))' < file
これにより、段落がに割り当てられます@list
。次に、それがforeach
(\$_ == \$list[-1]
チェック)の最後の要素であるかどうかをチェックする「3項演算」があります。""
(? ...
)の場合は印刷、それ以外の場合は()他のすべての「段落」(の要素: ...
)を印刷"\n"
します@list
。
awk
を回避するソリューションについて、あなたにも感謝しますsort
!卑劣!