使用unix命令/shell脚本将avro文件中的键值对数据提取为行和列形式

使用unix命令/shell脚本将avro文件中的键值对数据提取为行和列形式

我有一个包含以下数据集的文件。

{"table":{"string":"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函数来组合两者tableNAME对象,并join连接两个对象字符串字符串。


根据上次OP的问题更新,您将需要此命令(需要jq版本> = 1.5):

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

相关内容