我有一个大约200个代码的列表,如下所示:
EB0016
EB0017
EB0018
EB0019
EB0021
EB0023
EB0024
EB0026
EB0027
通过我工作中的一个系统,200列表中的各种"父"代码与相应的"子"代码的子集一起被放置在业务报告中,这些代码也来自同一200列表,如下面的代码块所示。
为了解释下面的值,对于放置代码父代码EB0016的每个报告,我们还看到子代码EB0148 15.8%的时间,以及子代码EB0192 13.7%的时间等。每当我们看到代码EB0017放置时,我们也看到EB0187 13.6%的时间等等。在下面的示例中,EB0016和EB0017是父值,我们可以看到子值以及十进制格式的百分比。
在json文件中,每个父代码只列出一次,因此有200个父代码。对于200个父代中的每一个,都列出了子代代码,每个子代都有相应的十进制频率,显示我们看到特定子代代码与父代代码一起放置的频率。
父代码和子代码都来自同一个200的列表,因此我现在有了可以创建完整矩阵的数据。
我的问题是,如何将这个json文件转换为csv文件,然后导入电子表格?通常情况下,我会尝试尝试一下一些代码,然后发帖寻求更多帮助,但经过大量搜索,我完全不知道该如何做到这一点。也许是awk?
{
"EB0016": {
"EB0148": 0.1581,
"EB0192": 0.1372,
"EB0135": 0.1177,
"EB0147": 0.0867,
"EB0110": 0.0822,
"EB0107": 0.0697
},
"EB0017": {
"EB0187": 0.1364,
"EB0148": 0.1312,
"EB0192": 0.093,
"EB0147": 0.0847
}
}
我想使用上面的json文件(我列出了2个父代码,但实际上大约有200个代码(并生成一个矩阵,如下所示:
EB0107 EB0110 EB0135 EB0147 EB0148 EB0187 EB0192
EB0016 0.0697 0.0822 0.1177 0.0867 0.1581 - 0.1372
EB0017 - - - 0.0847 0.1312 0.1364 0.093
好吧,我认为我已经找到了你想要的,jq
(在shell中处理JSON的事实上的标准工具(应该可以做到:
jq -r 'keys as $codes |
((["Code"] + $codes),
(to_entries | sort_by(.key)[] as $row |
reduce $codes[] as $c ([$row.key]; . + [$row.value[$c]? // "-"]))) |
@tsv' input_file.json
对于您的样品输入,它会产生
Code EB0016 EB0017
EB0016 - -
EB0017 - -
因为你的父代码不会作为彼此的子代码出现,但如果它们出现了,你会看到相应的数字,而不是破折号。
将@tsv
更改为@csv
以获得CSV输出,如您的问题所示(但不是所需输出的样本(。(请,请,请对这些事情保持一致,并提供相互匹配的样本输入和输出。这会让回答问题变得更容易(。
我不明白这个样本是如何产生输出的,但这里有一个使用GNU awk和json扩展的机会:
$ gawk '
@load "json"
BEGIN{
OFS="t"
PROCINFO["sorted_in"]="@ind_str_asc"
}
{
json=json $0
if(json_fromJSON(json,array)!=0) {
for(i in array)
for(j in array[i])
header[j]
for(i in header)
printf "%s%s%s",(++c==1?OFS:""),i,(c==length(header)?ORS:OFS)
for(i in array) {
c=0
printf "%s%s",i,OFS
for(j in header)
printf "%s%s",((v=array[i][j])?v:"-"),(++c==length(header)?ORS:OFS)
}
json=""
}
}' file.json
输出:
EB0107 EB0110 EB0135 EB0147 EB0148 EB0187 EB0192
EB0016 0.0697 0.0822 0.1177 0.0867 0.1581 - 0.1372
EB0017 - - - 0.0847 0.1312 0.1364 0.093
Json分机在这里可用。