숫자, 문자열, null, 부울과 같은 데이터가 포함된 모든 키를 덤프하기 위해 모든 jq 명령에 대해 단일 크기를 생성하려고 합니다.
배열 값에 도달하면 배열 이름을 인쇄하는 대신 배열 내부를 살펴보고 배열 내부에서 키 이름을 추출해야 합니다.
샘플 출력은 다음과 같습니다 ...
coord.lon
coord.lat
weather.0
weather.0.id
weather.0.main
weather.0.description
weather.0.icon
base
작동하는 다음 비트가 있지만 배열인 상위 키를 반환하므로 해당 키는 필요하지 않고 하위 키만 반환됩니다.
jq -r 'paths | map(.|tostring)|join(".")' weather.json
누구든지 도움을 줄 수 있나요? 나는 많은 어려움을 겪었습니다.
예제 JSON
{
"coord": {
"lon": -90.85,
"lat": 38.8
},
"weather": [
{
"id": 501,
"main": "Rain",
"description": "moderate rain",
"icon": "10d"
}
],
"base": "stations",
"main": {
"temp": 38.19,
"pressure": 1020,
"humidity": 100,
"temp_min": 36,
"temp_max": 39.99
},
"visibility": 4023,
"wind": {
"speed": 4.7,
"deg": 330
},
"rain": {
"1h": 1.82
},
"clouds": {
"all": 75
},
"dt": 1572448290,
"sys": {
"type": 1,
"id": 4178,
"country": "US",
"sunrise": 1572438477,
"sunset": 1572476760
},
"timezone": -18000,
"id": 0,
"name": "Wentzville",
"cod": 200
}
답변1
다음과 같이 먼저 배열을 삭제할 수 있습니다.
del(.[] | select(type=="array"))
개체만 유지하려면 다음을 수행합니다.
<infile.json jq -r '
del(.[] | select(type!="object")) |
paths |
map(tostring) |
select(length==2) |
join(".")
'
산출:
coord.lon
coord.lat
main.temp
main.pressure
main.humidity
main.temp_min
main.temp_max
wind.speed
wind.deg
rain.1h
clouds.all
sys.type
sys.id
sys.country
sys.sunrise
sys.sunset
편집하다
어쩌면 두 답변의 조합을 원하십니까?
paths(scalars) |
select(length >= 2) |
map(tostring) |
join(".")
산출:
coord.lon
coord.lat
weather.0.id
weather.0.main
weather.0.description
weather.0.icon
main.temp
main.pressure
main.humidity
main.temp_min
main.temp_max
wind.speed
wind.deg
rain.1h
clouds.all
sys.type
sys.id
sys.country
sys.sunrise
sys.sunset
답변2
이 작업은 다음과 같습니다.
jq -r 'paths(scalars) | map(.|tostring)|join(".")' weather.json
결과
coord.lon
coord.lat
weather.0.id
weather.0.main
weather.0.description
weather.0.icon
base
main.temp
main.pressure
main.humidity
main.temp_min
main.temp_max
visibility
wind.speed
wind.deg
rain.1h
clouds.all
dt
sys.type
sys.id
sys.country
sys.sunrise
sys.sunset
timezone
id
name
cod