Archive

1レコード内の複数の連続したデータを取り出して結合する方法

Engager

ご教授ください。

1つのレコードのパラメータで連続したデータA[],B[],C[]があります。
これらのデータの中身の個数は同数であり、順番も連携しています。
それぞれを取り出して意味のあるデータData(A[1],B[1],C[1])という形でデータを成型した上で分析に使いたいのですが、
方法はありますでしょうか?

データのイメージ
1レコードの構成:A[0,1,2,3,4・・・],B[10,11,12,13,14,・・・],C[100,200,300,400,・・・]
やりたいこと
Data1[A[0],B[0],C[0]),Data2[A[1],B[1],C[1]),Data3[A[2],B[2],C[2]),・・・
という風に纏めたい。

Tags (1)
0 Karma
1 Solution

Ultra Champion
| stats count
| eval raw="A[0,1,2,3,4],B[10,11,12,13,14],C[100,200,300,400,500]"
| fields - count
| eval raw=replace(raw,",(?=\w+\[)","#")
| makemv delim="#" raw
`comment("this is sample data")`
| rex field=raw "(?<field_name>[^\[]+)\[(?<data>[^\]]+)\]"
| eval Data_A=mvindex(data,0),Data_B=mvindex(data,1),Data_C=mvindex(data,2)
| foreach Data_* 
    [eval <<FIELD>> = split(<<FIELD>>,",")]
| eval datas=mvzip(Data_A,mvzip(Data_B,Data_C,","),",")
| mvexpand datas
| fields datas
| streamstats count 
| fields datas count
| eval field_name="Data_".count
| eval result = field_name."[".datas.")"
| stats values(result) as result
| eval final_result=mvjoin(result,",")

なんとか形になりました。こちらでどうでしょうか?

View solution in original post

0 Karma

Ultra Champion
| stats count
| eval raw="A[0,1,2,3,4],B[10,11,12,13,14],C[100,200,300,400,500]"
| fields - count
| eval raw=replace(raw,",(?=\w+\[)","#")
| makemv delim="#" raw
`comment("this is sample data")`
| rex field=raw "(?<field_name>[^\[]+)\[(?<data>[^\]]+)\]"
| eval Data_A=mvindex(data,0),Data_B=mvindex(data,1),Data_C=mvindex(data,2)
| foreach Data_* 
    [eval <<FIELD>> = split(<<FIELD>>,",")]
| eval datas=mvzip(Data_A,mvzip(Data_B,Data_C,","),",")
| mvexpand datas
| fields datas
| streamstats count 
| fields datas count
| eval field_name="Data_".count
| eval result = field_name."[".datas.")"
| stats values(result) as result
| eval final_result=mvjoin(result,",")

なんとか形になりました。こちらでどうでしょうか?

View solution in original post

0 Karma

Engager

SPLありがとうございます。
ただ、私の説明が悪く、、、申し訳ありません。

やりたかったことを再度補足させて頂きます。
上記SPLの resultの形でデータ化をしたかった感じです。

記載いただいたresultは
Data1[0,10,100]
Data
2[1,11,200]
Data3[2,12,300]
Data
4[3,13,400]
Data_5[4,14,500]
となると思います。私の質問だと確かにその通りだなと思うのですが、、、やりたかったことは

このData1を列として、各値を行として成型したかったというのが、本当にやりたかったことです。
Data
1:0,10,100
Data2:1,11,200
Data
3:2,12,300
Data4:3,13,400
Data
5:4,14,500

このData_xは時間単位でまとめようとしていました。
色々工夫頂いたのに、元の説明が悪く申し訳ありません。

何か方法御座いますでしょうか?

0 Karma

Ultra Champion
| stats count 
| eval raw="A[0,1,2,3,4],B[10,11,12,13,14],C[100,200,300,400,500]"
| fields - count
| eval raw=replace(raw,",(?=\w+\[)","#")
| makemv delim="#" raw
 `comment("this is sample data")`
| rex field=raw "(?<field_name>[^\[]+)\[(?<data>[^\]]+)\]"
| eval Data_A=mvindex(data,0),Data_B=mvindex(data,1),Data_C=mvindex(data,2)
| foreach Data_* 
     [eval <<FIELD>> = split(<<FIELD>>,",")]
| eval tmp=mvzip(Data_A,mvzip(Data_B,Data_C,","),",")
| mvexpand tmp
| fields tmp
| rex field=tmp "(?<Data_A>\d+),(?<Data_B>\d+),(?<Data_C>\d+)"
| fields - tmp

Data_A  Data_B  Data_C
0   10  100
1   11  200
2   12  300
3   13  400
4   14  500

こんな感じでしょうか

0 Karma

Ultra Champion
| stats count
 | eval raw="A[0,1,2,3,4],B[10,11,12,13,14],C[100,200,300,400,500]"
 | fields - count
 | eval raw=replace(raw,",(?=\w+\[)","#")
 | makemv delim="#" raw
 `comment("this is sample data")`
 | rex field=raw "(?<field_name>[^\[]+)\[(?<data>[^\]]+)\]"
 | eval Data_A=mvindex(data,0),Data_B=mvindex(data,1),Data_C=mvindex(data,2)
 | foreach Data_* 
     [eval <<FIELD>> = split(<<FIELD>>,",")]
 | eval datas=mvzip(Data_A,mvzip(Data_B,Data_C,","),",")
 | mvexpand datas
 | fields datas
 | streamstats count 
 | fields datas count
 | eval field_name="Data_".count
 | rex field=datas "(?<Data_A>\d+),(?<Data_B>\d+),(?<Data_C>\d+)"
 | fields field_name,Data_*

field_name  Data_A  Data_B  Data_C
Data_1  0   10  100
Data_2  1   11  200
Data_3  2   12  300
Data_4  3   13  400
Data_5  4   14  500

こちらでしょうか
0 Karma

Engager

申し訳ありません。自己解決しました。

記載頂いたSPLの応用で達成できました。ありがとうございます。
(mvindexで分解しました。)

0 Karma

Ultra Champion

了解です。
happy Splunking.

0 Karma