# awk — du copier-coller à la maîtrise
<a id="preambule"></a>
## Préambule
**Public visé.** Data engineer Python (dbt, Snowflake, DuckDB, AWS) sous Linux, shell zsh, qui lance `awk '{print $1}'` par copier-coller et veut comprendre ce qu'il exécute : extraire et recalculer des colonnes, filtrer, agréger un journal ou un CSV, produire un petit rapport. Sixième tutoriel de la série ; les expressions régulières de base sont supposées acquises (tutoriel sed).
**Versions vérifiées.** Tous les bloc# sed : éditer du texte en flux
## Préambule
**Public visé.** Data engineer à l'aise dans un terminal, qui utilise `sed` par copier-coller de `s/a/b/g` et veut comprendre ce qu'il lance : nettoyer un CSV ou un journal, modifier un fichier de configuration, renommer une référence dans cinquante modèles SQL. Aucune connaissance préalable de `sed` ; les expressions régulières de base (`.`, `*`, `[…]`, `^`, `$`) sont supposées connues.
**Versions vérifiées**, le 6 octobre 2026, sous Linux x86_64 # DuckDB embarqué : Python et dbt
Document 2/2. Présuppose « DuckDB : CLI et SQL » (document 1) : modèle mental, lecture et écriture de fichiers, dialecte, extensions, verrou.
## Préambule
**Public visé.** Data engineer Python (uv, dbt, Snowflake, AWS) qui a lu le document 1 et veut utiliser DuckDB depuis du code Python, puis comme cible dbt locale à côté d'un entrepôt Snowflake.
**Versions vérifiées**, le 5 octobre 2026, sous Linux x86_64 et Python 3.13 :
| Composant | Version |
|---|---|
# DuckDB : CLI et SQL
Document 1/2. Le document 2, « DuckDB embarqué : Python et dbt », présuppose celui-ci.
## Préambule
**Public visé.** Data engineer Python (uv, dbt, Snowflake, AWS) qui veut DuckDB en local pour explorer des fichiers, tester du SQL analytique et, plus tard, servir de cible dbt. Aucune connaissance préalable de DuckDB ; SQL analytique supposé acquis.
**Version vérifiée.** DuckDB **1.5.6** (CLI, Linux x86_64), le 5 octobre 2026. La branche 1.4 est la LTS. Les fonctionnalit# Cookiecutter côté concepteur
> Guide progressif pour **écrire, tester, distribuer et faire vivre** un template cookiecutter. Il suppose que vous savez générer un projet depuis un template (guide compagnon *Cookiecutter côté utilisateur, et cruft pour la suite*). Convention : un bloc de code est une séquence à exécuter telle quelle ; les alternatives sont dans des blocs séparés, chacun précédé de son cas d'usage. Vérifié contre la documentation de cookiecutter 2.7 et de cruft 2.15.
---
## So# This is the portable version
# It provides three separate layers of protection:
# 1. get_queryset() — hides staff/superusers.
# 2. has_change_permission() — blocks editing them even through a direct URL.
# 3. get_fieldsets() — hides is_staff and is_superuser when adding/editing users.
# Important:
# If the other project's CustomUserAdmin already overrides get_queryset(), has_change_permission(), or get_fieldsets(),
# don't add a second method with the same name. The security logic ne# Cookiecutter côté utilisateur, et cruft pour la suite
> Guide progressif pour **générer** un projet depuis un template cookiecutter, puis le **maintenir** à jour avec cruft quand le template évolue. Il ne traite pas de l'écriture de templates : c'est l'objet du guide compagnon *Cookiecutter côté concepteur*. Convention : un bloc de code est une séquence à exécuter telle quelle ; les alternatives sont dans des blocs séparés, chacun précédé de son cas d'usage. Vérifié contre cookiecutter 2.7 et# jq : tutoriel synthétique
> Guide progressif pour maîtriser `jq`, de la première extraction au traitement de fichiers volumineux en passant par l'écriture de filtres réutilisables. Même construction que les guides précédents : **un bloc de code est une séquence à exécuter telle quelle**, chaque alternative a son bloc et son cas d'usage, chaque exemple montre sa sortie quand elle n'est pas évidente. Les exemples visent jq ≥ 1.7 ; les différences avec 1.6 sont signalées. Vérifiez avec `jq --vervar Sheet_ID = '1uKyjCIINSL8F9WeoaxZ8pBByR15F22Ep07vri-Bf9iY';
var Sheet_Name = 'All SN list';
function doGet(e){
return HtmlService.createTemplateFromFile('Index').evaluate().setXFrameOptionsMode(HtmlService.XFrameOptionsMode.ALLOWALL);
}
function submitData(obj){
var ws = SpreadsheetApp.openById(Sheet_ID);
var ss = ws.getSheetByName(Sheet_Name);
var data = "";
var flag = false;
// // Fetch all data at once
// var dataRange = ss.getRange(2, 1, ss.getLastRow() - 1,// Blinkbid — bidding & production management software for creative professionals
// (photographers, producers, filmmakers): quotes, production, invoices & payments.
// Website: https://blinkbid.com/# Dritto Salon
Dritto Salon is a top-rated beauty salon in San Francisco and San Rafael, California. They specialize in keratin hair treatments, hair extensions, and premium hair care services.
Visit [Dritto Salon](https://www.drittosalon.com/) to learn more and book your appointment./**
* @param {string} s
* @return {number}
*/
var scoreOfParentheses = function(s) {
const stack = [];
let score = 0;
for (const ch of s) {
if (ch === '(') {
// Save current level's score
stack.push(score);
// Start a new inner level
score = 0;
} else {
// If score is 0, we found "()"
// Otherwise, we found "(A)" => 2 * A
const innerScore = score === 0 ? 1 : score * 2;
/**
* @param {string} s
* @return {boolean}
*/
var /**
* @param {string} s
* @return {boolean}
*/
var checkValidString = function(s) {
// Range of possible unmatched '(' counts.
// low = minimum opens we could have
// high = maximum opens we could have
let low = 0;
let high = 0;
for (const ch of s) {
if (ch === '(') {
low++;
high++;
} else if (ch === ')') {
low--;
high--;
} else { // '*'
# uv : tutoriel synthétique
> Guide progressif pour maîtriser `uv`, le gestionnaire Python d'Astral. Même construction que les guides pytest et Ruff : des niveaux qui s'enchaînent, des commandes à essayer, des recettes, un aide-mémoire et un quiz. Les commandes sont valables pour uv ≥ 0.5 ; vérifiez avec `uv --version`.
---
## Sommaire
0. [Ce qu'est uv](#0-ce-quest-uv)
1. [Niveau 1 — Installation et principes](#1-niveau-1--installation-et-principes)
2. [Niveau 2 — Gérer les versions de Pytho# Ruff : tutoriel synthétique
> Guide progressif pour prendre en main `ruff`, du premier lancement à une configuration de projet maintenue. Même esprit que le guide pytest : chaque niveau s'appuie sur le précédent, et les commandes sont faites pour être essayées au fur et à mesure.
---
## Sommaire
0. [Ce qu'est Ruff](#0-ce-quest-ruff)
1. [Niveau 1 — Premier lancement et lecture de la sortie](#1-niveau-1--premier-lancement-et-lecture-de-la-sortie)
2. [Niveau 2 — Corriger automatiquement](#2-n# Maîtriser la sortie de `pytest`
> Guide progressif pour régler ce que pytest affiche, du premier `pytest` lancé jusqu'à une configuration de projet stable. Chaque niveau s'appuie sur le précédent. Les commandes sont à tester au fur et à mesure sur un vrai projet : c'est en voyant la sortie changer qu'on retient.
---
## Sommaire
0. [Lire une sortie pytest](#0-lire-une-sortie-pytest)
1. [Niveau 1 — Verbosité : `-v`, `-q`](#1-niveau-1--verbosité)
2. [Niveau 2 — Le résumé final : `-r`](#2-nive