使用JQ问题解析复杂JSON文件

时间:2017-02-27 07:13:30

标签: json bash csv jq

我有一个包含100000个结果的大JSON文件。我知道如何使用'JQ'进行基本解析。

virus.json

{
  "detected": true,
  "result": "Trojan.Win32.Generic!BT",
  "update": "20170115",
  "version": "1.5.0.42"
}
{
  "detected": true,
  "result": "FileCryptor.NJX",
  "update": "20170115",
  "version": "16.0.0.4749"
}
{
  "detected": true,
  "result": "Generic.Ransom.Purge.DC87C66E",
  "update": "20170115",
  "version": "1.0.1.9"
}

但是在这个JSON文件中,我希望以CSV格式获取“检测到”和“结果”等字段。我知道如何使用JQ单独获取它。

我试过了,

1

$ jq -r ".detected" virus.json 

true
true
true

2

 $ jq -r ".result" dum_1.json 

    Trojan.Win32.Generic!BT
    FileCryptor.NJX
    Generic.Ransom.Purge.DC87C66E

3

jq -r ".detected,.result" dum_1.json 
true
Trojan.Win32.Generic!BT
true
FileCryptor.NJX
true
Generic.Ransom.Purge.DC87C66E

而不是#3,我希望输出为

输出

true , Trojan.Win32.Generic!BT
true , FileCryptor.NJX
true , Generic.Ransom.Purge.DC87C66E

有关如何获得结果的任何建议?

3 个答案:

答案 0 :(得分:3)

@csv将从一个平面数组转换为CSV,所以这应该让你开始:

jq -r '[.detected, .result] | @csv'

根据您的样本输入,这将产生:

true,"Trojan.Win32.Generic!BT"
true,"FileCryptor.NJX"
true,"Generic.Ransom.Purge.DC87C66E"

如果要删除引号,请考虑:

jq -r '"\(.detected), \(.result)"'

答案 1 :(得分:1)

您可以使用sed

jq -r ".detected,.result" dum_1.json | sed 'N;s/\n/ , /'
true , Trojan.Win32.Generic!BT
true , FileCryptor.NJX
true , Generic.Ransom.Purge.DC87C66E

sed N命令读取下一行,将两行连接在一起。

s命令正在将换行符\n替换为所需的模式,

答案 2 :(得分:1)

jq -r ".detected,.result" dum_1.json |awk -v OFS=, 'NR%2{x=$0;next} {print x OFS $0}'
true,Trojan.Win32.Generic!BT
true,FileCryptor.NJX
true,Generic.Ransom.Purge.DC87C66E