Solarisのsort -zと同じ(複数行のソートをサポート)

Solarisのsort -zと同じ(複数行のソートをサポート)

私は複数行の「チャンク」サポートを得るために「sort -z」(GNUでのみサポートされている)に対応するSolarisを探しています。一部のテキストを時系列(日付、時刻)に並べ替え、並べ替えの過程でテキストブロックが破壊されないようにしたいと思います。

たとえば、次のようになります。

2020-05-15:02:00:00:000 INFO[LF]
2020-05-15:02:00:02:000 INFO[LF]
[HT]some extra data as second line[LF]
[HT]2020-05-15:02:00:01:000 INFO[LF]
[HT]some extra data as second line[LF]
[HT]some extra data as third line[LF]
2020-05-15:02:00:04:000 INFO[LF]
2020-05-15:02:00:03:000 INFO[LF]
  • [HT]は水平タブキーで、[LF]は\n

次のように分類したいと思います。

2020-05-15:02:00:00:000 INFO[LF]
2020-05-15:02:00:01:000 INFO[LF]
[HT]extra data as second line[LF]
[HT]some extra data as third line[LF]
2020-05-15:02:00:02:000 INFO[LF]
[HT]extra data as second line[LF]
2020-05-15:02:00:03:000 INFO[LF]
2020-05-15:02:00:04:000 INFO[LF]

Centos/ubuntu(GNU) では次のように処理しました。 sort -zt : -k2,2 -k3,3n -k4,4n -k5,5n -k6,6n (milisec が正しく整列しているかどうかはわかりません).

注:

  1. msortは使用できません。 awk/sed/perl 1行のソリューションを歓迎します。
  2. 複数の行があるかどうかに関係なく、各行はLFで終わります。
  3. 複数行(前の2行目を含む)は、HF「タブ」文字で始まります。

ありがとうございます:-)

答え1

そしてperl

perl -0777 -ne 'print sort /^\d.*\n(?:\D.*\n)*/gm' your-file

ファイル全体をメモリにロードし(slurpモードを使用-0777 -p)、正規表現(^数字()で始まる行の後に\d0行以上の行)に基づいてチャンクを抽出してメモリに保存します。*\Dprintsort

答え2

ヌルで区切られたレコードをソートするには、データに表示されない文字が保証されている場合は、trそれをヌルバイトに置き換えることができます。ただし、これはデータが改行で区切られ、GNUソートにも特定の改行のみを区切り文字として扱うオプションがないため、直接的な助けにはなりません。改行シーケンスを改行文字を含まない項目に変換してソートし、元の翻訳を元に戻す必要があります。

データに一部の行の先頭にある単一のタブを除いてタブがないと仮定すると、タブの前の改行を削除して並べ替え後に再追加することが翻訳されることがあります。

awk '/^\t/ {line = line $0; next}
     {print line; line = $0}
     END {print line}' |
sort |
awk '{gsub(/\t/, "\n\t"); print}'

関連情報