ai-data : laissez un LLM local écrire vos one-liners jq et awk
Une fonction zsh qui lit un fichier JSON ou CSV, comprend ses vrais champs et propose 5 commandes jq/awk pratiques adaptées à ce fichier précis — choisies via fzf, puis déposées sur votre ligne de commande (pas exécutées à votre place) pour que vous puissiez voir, modifier et comprendre la commande exacte avant d'appuyer sur Entrée.
Traduction automatique
Cet article fait partie de la série Ollama au quotidien :
- Installer Ollama et obtenir une IA locale
- Accéder à Ollama depuis votre réseau local
- ai-test : générer les tests unitaires manquants depuis votre terminal avec un LLM local
- ai-review, ai-secrets, ai-commit : trois vérifications zsh avant chaque git commit
- AnythingLLM : discuter avec toute votre documentation éparpillée
- ai-translate & ai-summarize : des documents confidentiels, traités 100 % en local
- ai-diagram : d'une phrase (ou d'un compose.yaml) à un diagramme Mermaid
- ai-data : laissez un LLM local écrire vos one-liners jq et awk
- ai-explain : l'ELI5 des scripts et des erreurs, directement dans votre terminal

Cet article ajoute ai-data à la série « Ollama daily use » : pointez-la vers un fichier .json ou .csv et elle demande au modèle local 5 commandes jq/awk pratiques, adaptées aux noms de champs réels de ce fichier — pas des exemples génériques. Choisissez-en une avec fzf et, au lieu de l'exécuter pour vous, ai-data la dépose sur votre ligne de commande zsh avec print -z, prête à être lue, modifiée, puis seulement exécutée. L'objectif n'est pas juste d'avoir une réponse : c'est de repartir avec une commande que vous comprenez.
Mon usage de jq reste très basique ; je suis loin de savoir écrire une ligne avec group_by du premier coup. À chaque fois, c'est la même histoire : je dois bricoler (et perdre plusieurs minutes) juste pour obtenir ce que je veux — ou même… je ne sais même pas qu'une certaine fonctionnalité existe. Avec awk, c'est encore pire : je sais que ça existe et que c'est incroyablement puissant, mais la syntaxe est tout simplement impossible.
Démo — JSON
Cinq suggestions, listées par ce à quoi elles répondent — chacune construite sur les vrais noms de champs (active, birth_date, name) que le modèle a vus dans l'échantillon, pas sur des placeholders d'un tutoriel jq. En choisissant la quatrième dans fzf, ce filtre group_by exact s'est retrouvé sur mon prompt ; je l'ai lu, il avait l'air correct, j'ai appuyé sur Entrée.
Démo — CSV
Le modèle a remarqué tout seul que region est la colonne intéressante pour un regroupement, et a répondu avec le classique pipeline awk | sort | uniq -c — le genre de ligne que je reconnais quand je la vois mais que je n'écris jamais de mémoire. L'avoir lue une fois sur mon propre prompt, je la comprends mieux que si j'avais juste vu la sortie.
L'idée — des suggestions, pas des réponses
La plupart des fonctions de cette série posent une question au modèle et affichent la réponse — ai-diagram affiche un bloc Mermaid, prêt à coller. ai-data est différente volontairement : elle demande au modèle des commandes candidates, les présente via fzf, et quand vous en choisissez une, elle ne l'exécute pas — elle la dépose sur votre prompt, modifiable, grâce au print -z de zsh. Vous lisez le filtre jq ou le script awk exact avant qu'il ne touche vos données, et comme c'est vous qui appuyez sur Entrée, vous assimilez vraiment la syntaxe au lieu de simplement consommer la sortie.
print -z, en une phrase
print -z "some command" pousse une chaîne dans le buffer d'édition de zsh — le prompt suivant l'affiche pré-tapée, exactement comme si vous l'aviez saisie vous-même, curseur prêt, rien d'exécuté.
La fonction ai-data
Pas besoin de copier quoi que ce soit pour l'instant : les fichiers .zsh montrés dans cet article sont là pour être lus, et L'installer à la fin les crée tous dans ~/.zsh/fns/ pour vous.
# ai-data <file.json|file.csv> — analyze a JSON or CSV file and suggest 5# practical jq/awk commands tailored to its actual fields. Pick one via fzf;# instead of running it for you, it's loaded into your command line with# `print -z` so you can read it, edit it, and learn from it before hitting# Enter yourself.
AI_COMMANDS[data]="ai-data <file.json|file.csv> — suggest jq/awk commands tailored to this file"AI_PARAMS[data]="file"
ai-data() { local file="$1"
if [[ -z "$file" || ! -f "$file" ]]; then echo "Usage: ai-data <file.json|file.csv>" >&2 return 1 fi
local ext="${file:e:l}" local sample tool
case "$ext" in json) tool="jq" if jq -e 'type == "array"' "$file" >/dev/null 2>&1; then sample=$(jq -c '.[0:3]' "$file") else sample=$(head -c 3000 "$file") fi ;; csv) if command -v mlr >/dev/null 2>&1; then tool="awk, or mlr (Miller — detected as installed, prefer it for group-by/aggregation)" else tool="awk (Miller not detected — stick to awk/sort/uniq idioms)" fi sample=$(head -n 6 "$file") ;; *) echo "ai-data: unsupported extension .$ext (expected .json or .csv)" >&2 return 1 ;; esac
echo "→ Analyzing $file ($ext)..." >&2
local prompt="You are a data analyst who writes $tool one-liners. Below is a sample of a $ext file — the field names and shapes are real, only the row count is truncated. Suggest exactly 5 practical, ready-to-run commands a reader would actually want on THIS file: filtering, extracting specific fields, counting, grouping. Reference the real filename '$file' in every command. Output exactly one command per line, in this exact format and nothing else — no numbering, no markdown fences:COMMAND ||| one-line description of what it answers
--- SAMPLE ---$sample"
local suggestions suggestions=$(_ollama_query "$prompt") || return 1
if [[ -z "$suggestions" ]]; then echo "ai-data: no suggestions returned" >&2 return 1 fi
# "print -r" and never echo: zsh's echo expands escape sequences, and the # "\n" of an awk printf would split the suggestion over two lines. if ! command -v fzf >/dev/null 2>&1; then print -r -- "$suggestions" return 0 fi
local picked picked=$(print -r -- "$suggestions" | fzf --delimiter=' \|\|\| ' --with-nth=2 \ --prompt="ai-data > " --height=40% --reverse)
[[ -z "$picked" ]] && return 0
local cmd="${picked%% \|\|\| *}" # Same reason here: without -r, "\n" would reach the prompt as a real newline. print -rz -- "$cmd"}Cette fonction analyse un fichier JSON ou CSV, envoie un échantillon à une IA pour obtenir 5 commandes jq/awk pratiques et adaptées au fichier, puis les présente via fzf pour que tu en choisisses une — la commande choisie est alors chargée dans ta ligne de commande zsh sans l'exécuter, afin que tu puisses la lire, l'éditer et l'apprendre avant de la valider.
Étape par étape :
- Détecter JSON ou CSV à partir de l'extension.
- Construire un petit échantillon réel — pour le JSON, les 3 premiers éléments s'il s'agit d'un tableau (
jq -c '.[0:3]') ; pour le CSV, l'en-tête plus 5 lignes. Jamais le fichier entier : un CSV de 50 000 lignes n'a pas besoin d'en laisser plus de quelques-unes dans le prompt. - Pour le CSV, vérifier si
mlr(Miller) est installé — si oui, on indique au modèle qu'il peut proposermlrpour les regroupements/agrégations, ce qui se lit nettement mieux que l'équivalentawk. Sinon, il s'en tient àawk/sort/uniq. - Demander exactement 5 commandes, une par ligne, au format
COMMAND ||| description— délibérément pas une sortie JSON, car parser cinq lignes de « texte avant un triple pipe » est trivial et évite le risque que le modèle emballe sa réponse dans des blocs Markdown ou ajoute des commentaires. - Envoyer les cinq lignes dans
fzf, en n'affichant que la description (--with-nth=2) pour que vous choisissiez par intention, et non en plissant les yeux sur de la syntaxejq. - À la sélection,
print -rzdu premier champ de la commande choisie.
Pas de fzf ? Ça marche quand même
Sans fzf installé, ai-data affiche simplement les cinq suggestions en texte brut — vous copiez celle que vous voulez manuellement. Même information, un confort en moins.
Enregistrée dans le menu ai
Une ligne — AI_COMMANDS[data]=... — accessible via ai data <file> ou directement avec ai-data, aux côtés de toutes les autres fonctions de la série.
_ollama_query et le registre AI_COMMANDS vivent dans la fondation partagée _ollama.zsh introduite dans ai-test. Si vous avez déjà suivi un article précédent de cette série, elle est déjà dans ~/.zsh/fns/ et sourcée par votre autoloader — rien de plus à faire. Vous commencez ici ? C'est un des fichiers créés dans L'installer plus bas.
L'échantillonnage veut dire que le modèle peut se tromper sur les cas limites
Cinq lignes ne révéleront pas un champ null rare, un format de date incohérent trois lignes plus loin ou une colonne supplémentaire égarée. Les commandes proposées sont un bon point de départ, pas une garantie — exécutez-les, vérifiez que le nombre de lignes semble cohérent, et ajustez si les données réservent des surprises que l'échantillon ne montrait pas.
Points clés
ai-data en bref
- Un échantillon, pas le fichier entier — 3 éléments JSON ou 5 lignes CSV, assez pour voir les vrais noms de champs
- Des suggestions, pas une seule réponse — 5 commandes candidates, choisies par intention via
fzf print -z, pas d'exécution automatique — la commande choisie arrive sur votre prompt, modifiable, rien ne s'exécute avant que vous appuyiez sur Entréemlrquand il est disponible — syntaxe de regroupement/agrégation plus agréable queawksi Miller est installé- S'enregistre dans
ai— accessible viaai data <file>
L'installer
Tout tourne sur votre machine : zsh, curl et jq (qui construit la requête envoyée à Ollama), et un serveur Ollama joignable — voyez installer Ollama si vous n'en avez pas encore.
1. Créez les fichiers. Chaque fonction de cette série vit dans son propre fichier dans ~/.zsh/fns/. La commande ci-dessous crée ce dossier et les deux fichiers d'un coup — ou téléchargez le ZIP, ou créez chaque fichier à la main et collez-y son contenu. _ollama.zsh est la fondation partagée par toute la série : si un article précédent vous l'a déjà donnée, la copie ici est le même fichier.
Besoin d'aide ? Cliquez sur le bouton « Aide » ci-dessus pour les instructions de mise en place.
2. Chargez le dossier depuis ~/.zshrc. Déjà fait si vous avez suivi un article précédent de cette série. Sinon, ajoutez ces lignes à la fin de ~/.zshrc — elles sourcent chaque fichier .zsh du dossier, donc la prochaine fonction que vous ajouterez ne demandera aucun changement ici :
for fn_file in ~/.zsh/fns/*.zsh; do
source "$fn_file"
done
3. Ouvrez un nouveau terminal (ou lancez exec zsh dans celui en cours), et vérifiez que le shell connaît la nouvelle fonction :
type ai-data
ai-data is a shell function from …/ai-data.zsh signifie que vous êtes prêt. ai-data not found signifie que l'étape 2 manque.
Conclusion
ai-data est la fonction de cette série dont j'attends le plus en termes d'apprentissage, justement parce qu'elle refuse de me donner une réponse toute faite — elle me donne la commande et me laisse être celui qui la lance. Quelques semaines à piocher des filtres jq dans une liste fzf et à les lire avant d'appuyer sur Entrée, et je soupçonne que j'en aurai moins besoin qu'aujourd'hui. Ce serait une forme étrange de succès pour un outil d'IA : l'objectif n'est pas de l'utiliser pour toujours, c'est de se rendre discrètement moins nécessaire, un group_by à la fois.
Cet article fait partie de la série Ollama au quotidien :
- Installer Ollama et obtenir une IA locale
- Accéder à Ollama depuis votre réseau local
- ai-test : générer les tests unitaires manquants depuis votre terminal avec un LLM local
- ai-review, ai-secrets, ai-commit : trois vérifications zsh avant chaque git commit
- AnythingLLM : discuter avec toute votre documentation éparpillée
- ai-translate & ai-summarize : des documents confidentiels, traités 100 % en local
- ai-diagram : d'une phrase (ou d'un compose.yaml) à un diagramme Mermaid
- ai-data : laissez un LLM local écrire vos one-liners jq et awk
- ai-explain : l'ELI5 des scripts et des erreurs, directement dans votre terminal






