Grimoire-
Command
.es

GNU+Linux command memo

Memo_14 : Émincer des fichiers texte

D’après l’édition 11 des travaux d’Alain Leaper, 2018-04-10
Licence GPL

Pour toutes ces commandes, affichage signifie sortie sur le canal de sortie standard, par défaut l’écran. Cette sortie peut être redirigée dans un fichier ou par un tube (pipe).

1. wc : comptage des lignes, des mots ou des caractères d’un fichier

$ wc -l monFichier
12 monFichier (1)
$ wc -w monFichier
94 monFichier (2)
$ wc -c monFichier
600 monFichier (3)
$ wc -m monFichier
586 monFichier (4)
$ wc monFichier
 29  94 600 monFichier (5)
1 Affiche le nombre de lignes de monFichier
2 Affiche le nombre de mots de monFichier
3 Affiche le nombre d’octets. Ce nombre inclu EOF (le caractère de fin de fichier)
4 Affiche le nombre de caractères. Un caractère (notamment les caractères accentués du français en codage UTF-8) peut comporter plusieurs octets.
5 Affiche respectivement les nombres de : lignes, mots et octets

2. head : affichage es premières lignes d’un fichier

$ head monFichier (1)
$ head -15 monFichier (2)
$ head --l=-2 monFichier (3)
1 Sans option, affiche les 10 premières lignes du fichier.
2 Avec option -<nb>, ici -15, affiche les <nb> premières lignes.
3 Avec option --lines=-<nb> (pouvant être abrégé par -l, ici -2, la commande affiche toutes les lignes sauf les <nb> dernières. Notez le signe - devant le <nb>.

3. tail : affichage des dernières lignes d’un fichier

$ tail monFichier (1)
$ tail -3 monFichier (2)
$ tail --l=+4 monFichier (3)
1 Sans option, affiche les 10 dernières lignes du fichier.
2 Avec option -<nb>, ici -3, affiche les <nb> dernières lignes.
3 Avec option --lines=+<nb>, ici +4, affiche toutes les lignes à partir de la <nb>e (incluse). Notez le signe + devant le <nb>.

Exemple d’application :

Mettre dans un fichier (fic_12_13) les lignes 12 et 13 d’un fichier donné (monFichier).

$ tail --l=+12 monFichier | head -2 > fic_12_13

4. cut : affichage des fragments spécifiés de chaque ligne d’un fichier

La sélection s’applique à toutes les lignes du fichier, quelles soit organisées en colonne ou non.

4.1. Sélection par la position des caractères.

Une seule sélection :

Option -c : -cN-P sélection du caractère de rang N (inclus) jusqu’au caractère de rang P (inclus)

Exemple, ici avec redirection dans autreFichier:

$ cut -c5-12 monFichier > autreFichier

autreFichier contient alors dans chaque ligne les caractères de rangs 5 à 12 de monFichier.

Forme -cN- : sélection du caractère de rang N (inclus) jusqu’à la fin de la ligne. Forme -c-N : est équivalente à -c1-N (du début de la ligne jusqu’au caractère de rang N).

La virgule permet de cumuler les sélections :

Forme -cN-P, -cQ-R

Exemple :

$ cut -c5-7,9- (1)
1 Sélection des caractères de rangs 5 à 7 et de rang 9 jusqu’à la fin de ligne.

4.2. Sélection de champs limités par des séparateurs

Le séparateur par défaut est la tabulation. Plusieurs séparateurs consécutifs sont comptés comme autant de champs.

L’option -f indique une sélection par champs : -fN-P sélection du champ de rang N (inclus) jusqu’au champ de rang P (inclus).

Exemple, ici avec redirection dans autreFichier :

$ cut -f2-4 monFichier > autreFichier (1)
1 autreFichier contient dans chaque ligne les champs de rangs 2 à 4 de monFichier

Forme -fN- : sélection du champ de rang N (inclus) jusqu’à la fin de la ligne.

Forme -f-N : est équivalente à -f1-N (du début de la ligne jusqu’au champ de rang N).

4.3. Cas de lignes ne comprenant pas de séparateur de champ

Par défaut ces lignes sont sélectionnées intégralement.

Option -s : elle permet d’éliminer les lignes ne comprenant pas de séparateur de champ.

Exemple:

$ cut -f2-4 -s monFichier > autreFichier (1)
1 autreFichier ne contient plus (si elles existent) les lignes sans séparateur.

4.4. Choix d’un autre séparateur que celui par défaut (la tabulation)

Option -d<caractère> : caractère sera le séparateur de champ.

Exemple: sélection des 2 premiers champs, avec comme séparateur le caractère espace (' ').

$ cut -f-2 -d' '
Un seul séparateur à la fois est valide, dans cet exemple la tabulation n’est plus un séparateur.

Autre exemple: les champs sont séparés par le caractère ':'. Les lignes ne comprenant pas ce séparateur sont éliminées.

$ cut -f3- -d':' -s monFichier > autreFichier (1)
1 autreFichier contient dans chaque ligne les champs de rangs 3 jusqu’à la fin de ligne de monFichier.

5. sort : mise en ordre, éventuellement concaténation de lignes de fichier(s)

Le tri s’effectue selon les fragments spécifiés dans chaque ligne.

5.1. Sans option (options par défaut vis à vis du tri)

L’ordre des lignes est déterminé par le caractère de rang 1 (le plus à gauche). Si 2 (ou plus) lignes possèdent le même caractère, le caractère suivant est pris en considération (rang 2) pour le tri etc …​

On distingue (pour les fichiers codés unicode UTF-8) :

  • les caractères alphanumériques, par ordre de priorité 0 à 9, a à z, A à Z.

  • les autres caractères : —  les caractères non alphanumériques tels que #, :, ], etc. —  les lettres accentuées pour lesquels, bien qu’un classement déterministe existe, le plus simple est d’essayer.

$ sort monFichier
sort monFichier > autreFichier est équivalent à sort -o autreFichier monFichier mais il possible de spécifier le même fichier sort -o monFichier monFichier (passage par un fichier temporaire).

5.2. Séparateur de champs dans les lignes

Par défaut le séparateur de champs est le caractère espace.

L’option -t <caractère> permet de définir un autre séparateur champs.

$ sort -t : (1)
1 Défini : comme séparateur.

5.3. Spécification de champ(s) prioritaire(s) à retenir pour le tri

L’option -k permet de spécifier le rang des champs prioritaires à prendre en compte pour le tri.

-k N,P : les champs de rang N jusqu’au rang P (inclus), en priorité, déterminent le tri

-k N (P omis) : du rang N jusqu’à la fin de ligne

En cas d’égalité des champs prioritaires, la distinction s’opère en reprenant l’analyse de la ligne à partir du caractère le plus à gauche, puis, le suivant…

Il est possible de spécifier un intervalle de caractères, à l’intérieur d’un même champ.

-k N.p,Nq : à l’intérieur du champ de rang N, seuls les caractères de rangs p à q participent au tri.

Avec le sort de GNU cette dernière option ne fonctionne avec le séparateur par défaut que si on l’explicite dans la commande (c’est un bug, version 6.10).

Exemple: dans le cinquième champ, les caractères de rangs 2, 3 ,4 participent, en priorité, au tri.

$ sort -t ' ' -k 5.2,5.4 monFichier (1)
1 et non sort -k 5.2,5.4 monFichier

5.4. Tri selon des valeurs numériques

Les chiffres 0 à 9 ne sont plus considérés en tant que caractères, mais comme représentation d’une valeur.

En général, cela n’a de sens que pour un champ, ou un fragment de champ. Terminer la spécification de champ par la lettre n. Valable aussi pour un champ contenant une valeur sous forme décimale (avec un point, par de virgule).

$ sort -t - -k3.4,3.6n  monFichier (1)
1 Utilisation du séparateur '-', tri selon les caractères de rangs 4 à 6 du troisième champ.

5.5. Quelques autres options

-r : inverser l’ordre du tri (première ligne devient la dernière).

-i : les caractères minuscules et majuscules sont indistincts.

-d : ignore les caractères autres les chiffres, les lettres et l’espaces.

-u : élimine les doublons (ne garde qu’une seule ligne si plusieurs sont identiques).

5.6. Vérification de l’état trié, ou non, d’un fichier

L’option -c permet cette vérification. Évidemment, si les conditions de tri préalables ne sont pas celles par défaut, il est indispensable de les repréciser lors de la vérification.

Exemple, génération d’un fichier trié, puis contrôle:

$ sort -o fic_tri -t - -k3.4,3.6n  monFichier (1)
$ sort -c -t - -k3.4,3.6n fic_tri (2)

Un fichier non trié (avec ces critères) provoque un message d’erreur (et valeur de retour égale 1).

La sortie en cas de succès (valeur de retour égale 0) peut être exploitée de la manière "habituelle" avec bash.

$ sort -c -t - -k3.4,3.6n fic_tri && echo "ce fichier est trié"

5.7. Concaténation avec tri de fichiers préalablement triés

L’option -m n’a de sens qu’avec des critères de tri identiques pour les tris préalables et pour le tri final.

$ sort -m <critères de tri> fichierTri_1 fichierTri_2 fichierTri_3 (1)
1 fichierTri_1, fichierTri_2, fichierTri_3 doivent être déjà triés avec les mêmes critères…

6. tr : modification de séquences de caractères

Le canal d’entrée standard par défaut étant le clavier, il est en général redirigé à partir d’un fichier ou utilise la sortie d’un tube (pipe |).

Il existe, en général, plusieurs outils alternatifs à tr. La suite se contente de donner quelques exemples d’utilisation.

$ tr 'motif_1' 'motif_2' < monFichier >autreFichier
$ cat monFichier | tr 'motif_1' 'motif_2' >autreFichier
Il n’y a pas de fichier temporaire (contrairement à sort), <monFichier >monFichier vide celui-ci (taille nulle) !

6.1. Remplacement d’un motif par un autre

$ tr 'de' 'WZ' < monFichier (1)
1 Tous les 'd' sont remplacés par des 'W' puis les 'e' par des 'Z'

Il est important de bien comprendre ce mécanisme dans le cas où 'motif_1' et 'motif_2' sont d’inégales longueurs.

$ tr 'dea' 'WZ' < monFichier (1)
1 Le dernier caractère à remplacer (ici 'a') sera remplacé par le dernier caractère disponible (ici 'Z').

6.2. Utilsation d’intervalles tels que a-z ou A-Z ou 0-9

$ tr '0-9' ':' < monFichier (1)
1 Tous les chiffres remplacés par ':'

6.3. Utilisation de classes (voir le man pour les différentes classes possibles)

$ tr [:lower:]  [:upper:] < monFichier (1)
1 Toutes les lettres minuscules remplacées par des majuscules.

6.4. Suppression de répétition (pas de 'motif_2' dans ce cas)

$ tr -s '#,' < monFichier (1)
1 Dans une séquence de plusieurs '#' ou ',' consécutifs, une seule occurrence est conservée.

6.5. Suppression de séquences de caractères (pas de 'motif_2' dans ce cas)

$ tr -d 'c-e#' < monFichier (1)
1 Supprime toutes les minuscules de l’intervalle de c à e (donc : c,d,e) ainsi que #

6.6. Remplacer chaque caractère de motif_1 par la répétition d’un caractère

Toute séquence de caractères constituants [motif_1] est remplacée par une séquence de même longueur du caractère C défini par [C*] de motif_2.

$ tr '[lmutv]' '[$*]' < monFichier (1)
1 ulm remplacé par $` ; `mutvl` ; par `$` ; `t` par `$` ; `mv` par ` ; etc.

6.7. Négation

Tous les caractères sauf ceux constituants motif_1 sont remplacés par le caractère de motif_2

$ tr -c 'a-zA-Z0-9 \n'  ':' (1)
1 Tout ce qui n’est pas : line feed ; espace ; lettres (minuscules ou majuscules) ; chiffres est remplacé par le caractère :