特定のデータ行に基づいてデータブロックをソートする

特定のデータ行に基づいてデータブロックをソートする

この素晴らしいコミュニティは、情報行を並べ替えるための以下のスクリプトを提供しました。

開始{

FS=":"
PROCINFO["sorted_in"]="@val_str_asc"
}

/./ {
値[$1]=$0
}

/^$/ {
asort(values)
for (値の要素)
印刷値 [要素]
印刷 ""
値を削除
}

終了{

asort(value)
for (値の要素)
print value[element]
}

各ブロックはアルファベット順に並べられ、元の意図したとおりに動作します(下記参照)。 sessionStartTimeに基づいて、これらのすべてのデータチャンク(各チャンク間の物理スペースを含む)をソートするように求められました。私はこれがはるかに難しいと思いました。なぜなら、それぞれの8行ブロックを一緒に接着する必要があるからです。

cabLoginID: 0557CAWG0FP27K31JG7Q
ログイン: john
memoryInfo: jsHeapSizeLimit: 2181038080
セッション: cabSessionID: 05P2R3PJGKG2Y2XE4NCZ
セッション開始時間: 2018-10-18T13:03:00.973Z
合計 JSHeapSize: 36675584
JSHeapSize 使用: 2972​​1040
userAgent: Mozilla/5.0

cabLoginID: 05P4X6K6GFPJ7K31EJ7H
ログイン: bob
メモリ情報: jsHeapSizeLimit: 2181038080
セッション: cabSessionID: 0536XLJPG7BJXRN42A0F
セッション開始時間: 2018-10-11T11:37:28.195Z
合計 JSHeapSize: 54501376
JSHeapSize 使用: 35478968
userAgent: Mozilla/5.0

cabLoginID:053XCDTF8D4J6PD3BG8PLogin
:jack
memoryInfo:jsHeapSizeLimit:2217857988
セッション:cabSessionID:052FPBP6Q6X2XGERWHBT
セッション開始時間: 2018-10-01T01:04:10.899Z
合計 JSHeapSize: 42358792
使用 JSHeapSize: 36482584
userAgent: Mozilla/5.0

望ましい結果:

cabLoginID:053XCDTF8D4J6PD3BG8PLogin
:jack
memoryInfo:jsHeapSizeLimit:2217857988
セッション:cabSessionID:052FPBP6Q6X2XGERWHBT
セッション開始時間: 2018-10-01T01:04:10.899Z
合計 JSHeapSize: 42358792
使用 JSHeapSize: 36482584
userAgent: Mozilla/5.0

cabLoginID: 05P4X6K6GFPJ7K31EJ7H
ログイン: bob
メモリ情報: jsHeapSizeLimit: 2181038080
セッション: cabSessionID: 0536XLJPG7BJXRN42A0F
セッション開始時間: 2018-10-11T11:37:28.195Z
合計 JSHeapSize: 54501376
JSHeapSize 使用: 35478968
userAgent: Mozilla/5.0

cabLoginID: 0557CAWG0FP27K31JG7Q
ログイン: john
memoryInfo: jsHeapSizeLimit: 2181038080
セッション: cabSessionID: 05P2R3PJGKG2Y2XE4NCZ
セッション開始時間: 2018-10-18T13:03:00.973Z
合計 JSHeapSize: 36675584
JSHeapSize 使用: 2972​​1040
userAgent: Mozilla/5.0

ベストアンサー1

タイムスタンプがそのロケールで語彙的にソートされており、GNU Awkバージョン4.0以降が提供されているとします。

gawk -vRS= '
  match($0,/sessionStartTime:([^[:space:]]*)/,m) {
    a[m[1]] = $0
  } 
  END {
    PROCINFO["sorted_in"] = "@ind_str_asc" 
    for (i in a) print a[i] "\n"
  }' file

Perlでも同様の方法:

perl -00 -lne '
  $h{$1} = $_ if /sessionStartTime:(\S*)/
  }{
  for $k (sort keys %h) {print $h{$k}}
' file

おすすめ記事