msort(1)
複数行のレコードを含むファイルをソートできるように設計されました。オプションの gui と、人間が使用できる通常のコマンド ライン バージョンがあります。 (少なくとも、マニュアルを注意深く読み、例を探すのが好きな人間...)
AFAICT、レコードに任意のパターンを使用することはできないため、レコードが固定サイズ(文字や行ではなくバイト単位)でない限り。 msort
-b
があります 空白行で区切られた行のブロックであるレコードのオプション。
入力を -b
で動作する形式に変換できます すべての ###...
の前に空行を置くことで、非常に簡単に (最初のものを除く)。
デフォルトでは、stderr に統計を出力するため、少なくとも、入力全体が 1 つのレコードであると見なされてソートされなかった場合は簡単にわかります。
msort
あなたのデータに働きかけます。 sed
コマンドは #+
ごとに改行を追加します 行 1 を除く行。 -w
レコード全体を (辞書順で) ソートします。レコードのどの部分をキーとして使用するかを選択するオプションがありますが、私には必要ありませんでした.
また、余分な改行の削除も省略しました。
$ sed '2,$ s/^#\+/\n&/' unsorted.records | msort -b -w 2>/dev/null
####################################
KEY1
VAL11
VAL12
VAL13
VAL14
####################################
KEY2
VAL21
VAL22
VAL23
VAL24
####################################
KEY3
VAL31
VAL32
VAL33
VAL34
-r '#'
で運が悪かった それをレコードセパレーターとして使用します。ファイル全体を 1 つのレコードと見なしていました。
解決策は、最初にブロック内の改行を選択した未使用の文字 (以下の例では「|」) に変更し、結果を並べ替えて、選択した区切り記号を元の改行に戻すことです:
sed -e 'N; N; N; N; N; s/\n/|/g' file.txt \
| sort -k2,2 -t\| \
| sed 's/|/\n/g'
perl -0ne 'print sort /(#+[^#]*)/g' file.txt
perl -0
ファイル全体をすする/(....)/g
レコードを照合して抽出するprint sort ...
並べ替えて印刷