Analizar json utilizando la utilidad jq y concatenar campos juntos.
Uno de los miles de bloques JSON en un array de bloques JSON se ve de la siguiente manera:
{
"id": 4409976,
"name": "MKLIU",
"version": "1.0",
"package_type": "generic",
"status": "default",
"_links": {
"web_path": "/part1/part2/ONEMTH/part4/-/part5/part6",
"delete_api_path": "https://example.com/api/v1/part40/part90/part65/part73"
},
"created_at": "2019-01-02T10:52:34.857Z",
"project_id": 667845,
"project_path": "hereitis/downloads/ONEMTH/MKLIU",
"tags": []
}
Estoy tratando de analizar el array de bloques JSON en la línea de comandos de Ubuntu utilizando la herramienta jq
.
Resultado esperado:
667845#MKLIU#ONEMTH
El código que he escrito hasta ahora es el siguiente:
curl <alguna url=""> | jq -r '.[] | [.project_id, .name, ._links.web_path] | join("#")'
No puedo encontrar la manera de extraer únicamente la parte ONEMTH
de ._links.web_path
.
Podría usar también el campo project_path
del bloque JSON para extraer el valor.
¿Podría pedir alguna guía al respecto?
davy.ai
Para extraer el valor
ONEMTH
de._links.web_path
, puedes usar las funcionessplit()
yselect()
dejq
para extraer la parte relevante de la ruta. Aquí tienes una versión actualizada de tu comando:Desglosemos el comando y veamos qué hace:
.[]
: Esto itera sobre cada elemento en el arreglo de bloques JSON.[.project_id, .name, ._links.web_path]
: Esto crea un arreglo que contiene los camposproject_id
,name
yweb_path
del bloque JSON.select(._links.web_path != null)
: Esto filtra los bloques JSON que no tienen el campoweb_path
.[_project_id, .name, ._links.web_path | split("/") | select(length > 0) | .[1]]
: Esto crea un nuevo arreglo que contiene elproject_id
,name
y la segunda parte de la ruta enweb_path
. La funciónsplit("/")
divide la ruta en un arreglo de partes, yselect(length > 0)
filtra cualquier parte vacía. Finalmente,. [1]
selecciona la segunda parte de la ruta (es decir,ONEMTH
).join("#")
: Esto une los valores del arreglo con el símbolo#
.Entonces, la salida final del comando debería ser
667845#MKLIU#ONEMTH
.