unixコマンド/シェルスクリプトを使用して、avroファイルのキーと値のペアデータを行形式と列形式で抽出します。

unixコマンド/シェルスクリプトを使用して、avroファイルのキーと値のペアデータを行形式と列形式で抽出します。

次のデータセットを含むファイルがあります。

{"テーブル":{"文字列":"ABC"} "TYPE":{"string":"U"} "TS":{"string":"2019-08-19 12:45:12.006362"} " C_TS":{"string":"2019-08-19 07:45:13.631000"} "dpt":{"string":"12345"} "ID":{"string":"123456789"} "FUC" :{"string":"ABC"} "QDSA":{"string":"0"} "SVCD":{"string":"S"} }

次の形式で出力されます。予想出力:

テーブル|タイプ|TS|C_TS|dpt|ID|FUC|QDSA|SVCD

ABC|U|2019-08-19 12:45:12.006362|2019-08-19 07:45:13.631000|12345|123456789|ABC|0|S|

答え1

次のコマンドを試してください。素晴らしい作品。

注文する

awk -F ":" '{print $3,$NF}' p.txt| sed 's/"\}*//g'| sed "s/,NAME/|/g"| sed -r "s/\s+//g"| sed '1i table|NAME'

出力

table|NAME
ABC|A

ABC|A

ABC|B

ABC|A

ABC|B

答え2

$ { echo 'table|NAME'; jq -r '"\(.table.string)|\(.NAME.string)"' file; }
table|NAME
ABC|A
ABC|A
ABC|B
ABC|A
ABC|B

jqこれは、各JSONオブジェクトのデータを解析して、NAMEオブジェクト内のテーブル名と文字列を含む各出力行の文字列を生成するために使用されます。

ヘッダーは使いやすいですecho

答え3

もう一つのjq答え:

{ echo 'table|NAME'; <file jq -r 'map(.string)|join("|")'; }

関数を利用してオブジェクトと文字列をmap結合し、2つのオブジェクト文字列を連結します。tableNAMEjoin


最後のOPの質問の更新に応じて、次のコマンドが必要です(jqバージョン> = 1.5が必要です)。

<file jq -r 'keys_unsorted,map(.string)|join("|")'

関連情報