我得到以下格式的 json 数据,我更喜欢使用 usesed
或awk
,jq
不支持,grep -o
solaris 盒子上不支持
[{"FRUIT":"APPLE","CAR":"FORESTER","COMPANY":"SUBARU","MAKE":"2015","CITY":"UNION CITY","STATE":0,"COUNTRY":0,"LOCATION":0,"RANK":"1"},{"FRUIT":"MANGO","CAR":"OUTBACK","COMPANY":"SUBARU","MAKE":"2017","CITY":"EDISON","STATE":0,"COUNTRY":0,"LOCATION":0,"RANK":"2"},{"....."}]
我正在寻找提取第二列的数据
"FORESTER"
"OUTBACK"
答案1
您可以使用json_xs
,它通常默认安装在任何支持 Perl 的系统上:
json_xs -f json -t json-pretty < file | grep '"CAR"' | cut -d ':' -f2 | cut -d '"' -f2
或者使用 Python:
python3 -m json.tool file | grep '"CAR"' | cut -d ':' -f2 | cut -d '"' -f2
答案2
尝试以下命令
$ sed "s/{/\n/g" file.txt | awk -F, 'NF>=2{split($2,Arr,":");print Arr[2]}'
"FORESTER"
"OUTBACK"
我们使用 sed 命令将单行分成多行,然后使用 awk,我们检索第二列值
答案3
这不是最优雅的方法,但这适用于您的示例数据:
$ tr , '\n' < file | awk -F: '{if(/\{/){NR=1}}NR==2{print $2}'
"FORESTER"
"OUTBACK"
将用换行符tr
替换所有,
内容。 awk 会NR
在0
看到{
.由于NR
保存当前行号并在每行自动递增,这意味着它只会出现2
在每组键值对的第二行。那么,当NR
is时2
,我们打印第二个:
- 分隔的字段。
或者,使用支持 JSON 数据的适当脚本语言。例如,在perl
:
$ perl -M"JSON" -lne 'my $json = decode_json($_);
foreach $f (@{$json}){print $f->{"CAR"};}' file
FORESTER
OUTBACK
答案4
我在这个答案中使用的工具jq
可以从以下位置下载https://stedolan.github.io/jq/(甚至对于 Solaris)并安装在非 root 用户的主目录中,没有任何 root 访问权限。此外,它根本没有任何运行时依赖性。
JSON 文档中没有“第二列”。你的文件也可以这样写
[
{
"FRUIT": "APPLE",
"CAR": "FORESTER",
"COMPANY": "SUBARU",
"MAKE": "2015",
"CITY": "UNION CITY",
"STATE": 0,
"COUNTRY": 0,
"LOCATION": 0,
"RANK": "1"
},
{
"FRUIT": "MANGO",
"CAR": "OUTBACK",
"COMPANY": "SUBARU",
"MAKE": "2017",
"CITY": "EDISON",
"STATE": 0,
"COUNTRY": 0,
"LOCATION": 0,
"RANK": "2"
}
]
添加的空格不会影响实际的 JSON 数据。
要提取与 key 对应的所有条目的值CAR
,请使用jq
命令行 JSON 解析器:
$ jq '.[].CAR' file.json
"FORESTER"
"OUTBACK"
该表达式的.[].CAR
意思是“对于最顶层数组的每个元素,返回键的值CAR
”。
如果您希望输出中没有引号,请将-r
(或--raw-output
) 添加到jq
调用中。这将返回解码后的数据。