6 votes

Pourquoi `inputs` saute la première ligne du fichier d'entrée ?

Lorsque je fournis un fichier à jq et que j'utilise la fonction inputs Je ne récupère que toutes les lignes sauf la première et je me demande pourquoi

J'utilise actuellement jq 1.6 et j'essaie d'utiliser la fonction inputs pour convertir un fichier TSV (Tab Separated Values) en JSON en saisissant la première ligne du fichier comme en-tête et en plaçant chaque en-tête comme clé de la valeur correspondante dans les lignes suivantes.

Si j'exécute ce qui suit

echo -n 'line1'$'\n''line2' | jq -R 'inputs'

Le résultat est

line2

et non

line1
line2

comme je m'y attendais

Comme solution de rechange, j'ajoute actuellement une nouvelle ligne à l'entrée que je donne à jq, comme suit

echo -n $'\n''line1'$'\n''line2' | jq -R 'inputs'

mais mon attente est de pouvoir utiliser inputs et faire en sorte qu'il traite la première ligne

7voto

chepner Points 54078

jq lise lui-même la première ligne, alors inputs (ayant reçu cette ligne comme son entrée) lira le reste. Typiquement, vous voulez utiliser la méthode -n pour empêcher jq d'effectuer lui-même toute lecture, en laissant input o inputs les filtres font la lecture proprement dite.

$ echo -n $'line1\nline2\n' | jq -nR 'inputs'
"line1"
"line2"

Dans votre cas, laisser jq lire l'en-tête et inputs lire le reste des données est raisonnable, mais vous devez faire quelque chose avec l'en-tête. C'est probablement plus compliqué que nécessaire, mais cela fait l'affaire :

$ cat tmp.tsv
foo bar baz
1   2   3
4   5   6
$ jq -R 'split("\t") as $h | [inputs | split("\t") | [{key: $h[0], value: .[0]}, {key: $h[1], value: .[1]}, {key: $h[2], value: .[2]}] | from_entries]' tmp.tsv
[
  {
    "foo": "1",
    "bar": "2",
    "baz": "3"
  },
  {
    "foo": "4",
    "bar": "5",
    "baz": "6"
  }
]

jq lit la première ligne et la divise dans le tableau h puis transmet cette ligne à un filtre qui l'ignore mais utilise inputs pour lire le reste des lignes, en séparant chacune d'elles et en créant un dict en utilisant (de manière répétée) la valeur de $h .

2voto

peak Points 71

L'explication de @chepner sur -n est bien, mais j'aimerais illustrer comment debug peut aider à clarifier et/ou démystifier le comportement de jq.

Puisque chaque programme jq est un filtre, il est toujours possible de voir ce qu'est l'entrée d'un filtre donné en le faisant précéder du suffixe debug donc par exemple :

echo 1 2 3 | jq 'debug | inputs'

rendements :

["DEBUG:",1]
2
3

C'est à dire, dans ce cas, l'entrée de inputs est 1, ce qui est consommé par inputs et autrement ignorés.

Nous pouvons de la même manière examiner l'effet de l'utilisation de l'option -n option de ligne de commande :

echo 1 2 3 | jq -n 'debug | inputs'
["DEBUG:",null]
1
2
3

C'est-à-dire que nous pouvons maintenant voir que le -n L'option indique à jq de fournir null comme entrée pour inputs plutôt que de l'obtenir à partir de STDIN.

En bref, debug est utile non seulement pour le débogage, mais aussi pour la compréhension du bricolage.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X