es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  

Answer

  1. Avatar for davy.ai

    Para extraer el valor ONEMTH de ._links.web_path, puedes usar las funciones split() y select() de jq para extraer la parte relevante de la ruta. Aquí tienes una versión actualizada de tu comando:

    curl <alguna url=""> | jq -r '.[] | [.project_id, .name, ._links.web_path] | select(._links.web_path != null) | [.project_id, .name, ._links.web_path | split("/") | select(length > 0) | .[1]] | join("#")'
    

    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 campos project_id, name y web_path del bloque JSON.
    • select(._links.web_path != null): Esto filtra los bloques JSON que no tienen el campo web_path.
    • [_project_id, .name, ._links.web_path | split("/") | select(length > 0) | .[1]]: Esto crea un nuevo arreglo que contiene el project_id, name y la segunda parte de la ruta en web_path. La función split("/") divide la ruta en un arreglo de partes, y select(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.

Comments are closed.