# 3.4 - Trier et transformer avec sort, uniq, cut, sed et awk

Les petits outils Unix sont conçus pour être combinés. Ils permettent d'extraire une information sans ouvrir un tableur ou écrire un programme complet.

## Compter avec wc

```bash
wc fichier.txt
wc -l fichier.txt       # lignes
wc -w fichier.txt       # mots
wc -c fichier.txt       # octets
```

## Trier et supprimer les doublons

```bash
sort noms.txt
sort -n nombres.txt
sort -h tailles.txt
sort -r noms.txt
sort noms.txt | uniq
sort noms.txt | uniq -c | sort -nr
```

`uniq` ne regroupe que les lignes identiques adjacentes ; il est donc souvent précédé de `sort`.

## Extraire des colonnes

```bash
cut -d: -f1 /etc/passwd
cut -d';' -f1,3 inventaire.csv
```

`cut` convient aux séparateurs simples. Un CSV avec des guillemets, des retours à la ligne ou des séparateurs échappés nécessite un véritable analyseur CSV.

## Remplacer des caractères avec tr

```bash
printf '%s\n' 'bonjour' | tr '[:lower:]' '[:upper:]'
tr -d '\r' < windows.txt > linux.txt
tr ':' '\n' < /etc/passwd
```

## Transformer avec sed

Afficher sans modifier :

```bash
sed -n '1,10p' fichier.txt
sed 's/ancien/nouveau/g' fichier.txt
sed '/^#/d; /^$/d' fichier.conf
```

Créer un nouveau fichier :

```bash
sed 's/ancien/nouveau/g' fichier.txt > fichier-modifie.txt
```

La modification directe `sed -i` varie entre GNU/Linux et BSD/macOS. Créer d'abord une sauvegarde :

```bash
sed -i.bak 's/ancien/nouveau/g' fichier.txt
```

## Extraire avec awk

```bash
awk -F: '{print $1}' /etc/passwd
awk '{print NR, $0}' fichier.txt
awk '$3 > 80 {print $1, $3}' mesures.txt
df -P | awk 'NR>1 {print $6, $5}'
```

Dans `awk`, `$1` désigne le premier champ, `$0` toute la ligne et `NR` le numéro de ligne.

## Exemple combiné

Compter les shells déclarés dans `/etc/passwd` :

```bash
cut -d: -f7 /etc/passwd | sort | uniq -c | sort -nr
```

Tester d'abord les transformations sans `-i`, comparer le résultat avec `diff`, puis remplacer le fichier uniquement après validation.