Traitement de données

Comptage de lignes, de mots et de caractères : wc

La commande wc compte le nombre de lignes, de mots et de caractères.

Syntaxe

wc [OPTION]... [FILE]...
Principales options :
-l Compter le nombre de lignes
-w Compter le nombre de mots
-c Compter le nombre d'octets
-m Compter le nombre de caractères
-C Identique à -m

Exemples

Nombre de lignes, mots et caractères du fichier depts2012

$ wc depts2012
  99  594 2769 depts2012
$

Nombre de lignes uniquement

$ wc -l depts2012
99 depts2012
$

Nombre de mots uniquement

$ wc -w depts2012
594 depts2012
$

Nombre de caractères uniquement

$ wc -m depts2012
2769 depts2012
$

Nombre de caractères contenus dans un texte saisi au clavier (attention au saut de ligne ajouté par la commande echo)

$ read texte
ceci est un texte
$ echo "$texte" | wc -c
18     # Le saut de ligne est comptabilisé
$ echo -e "$texte\c" | wc -c
17     # Avec l'option -e et \c le saut de ligne n'est pas comptabilisé
$ echo -n "$texte" | wc -c
17     # Idem mais avec l'option -n
$

Etiquettes: 

Extraction de caractères : cut

La commande cut sert à récupérer des caractères ou des champs d'une ligne.

Syntaxe

Couper par caractères

cut -c3 [fichiers ...] Le 3ème caractère
cut -c3-5 [fichiers ...] Du 3ème au 5ème caractère
cut -c-3 [fichiers ...] Jusqu'au 3ème caractère
cut -c3- [fichiers ...] A partir du 3ème caractère
cut -c3,10 [fichiers ...] Le 3ème et le 10ème caractère

Couper par champs

cut -dsep -f3 [fichiers ...] Le 3ème champ
cut -dsep -f3-5 [fichiers ...] Du 3ème au 5ème champ
cut -dsep -f-3 [fichiers ...] Jusqu'au 3ème champ
cut -dsep -f3- [fichiers ...] A partir du 3ème champ
cut -dsep -f3,10 [fichiers ...] Le 3ème et le 10ème champ

L'option -d permet d'exprimer le caractère séparateur de champ. Le caractère séparateur par défaut est la tabulation.

Exemples

Couper les 2 Premiers chiffres d'un code postal

$ echo 44150 | cut -c1-2
44
$

Afficher le 1er, 6ème et 7ème champs des 5 dernières lignes du fichier /etc/passwd

$ tail -5 /etc/passwd | cut -d: -f1,6,7
nobody:/nonexistent:/bin/sh
libuuid:/var/lib/libuuid:/bin/sh
postfix:/var/spool/postfix:/bin/false
sshd:/var/run/sshd:/usr/sbin/nologin
mysql:/var/lib/mysql:/bin/false
$

Si le caractère séparateur est un caractère spécial du shell, il faut le protéger.

$ ligne="val1|val2|val3"
$ echo $ligne | cut -d'|' -f1
val1
$

Etiquettes: 

Tri de données : sort

La commande sort permet de trier les lignes d'un flux de données textes.

Syntaxe

sort [options] -k champs[.car] [options], champ[.car] [options] [fichiers ...]
Principales options :
-b : Option à utiliser lorsque le critère de tri est alphanumérique et que les valeurs dans les champs sont calés à droite et complétés avec des espaces à gauche
-k : champ [.car] [options] , champ [.car] [options] Spécifier le ou les champs à prendre en compte en tant que critère de tri. Le critère de tri peut commencer ou finir à une certaine position de caractère du champ.
-n : Préciser que le critère de tri doit être traité comme valeur numérique et non comme chaine de caractères.
-r : Demander un tri décroissant
-t sep : Préciser le caractère séparateur de champs (espace par défaut)
-u : Suppression des doublons

 

Exemples

Utilisation du fichier /etc/passwd

$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
lp:x:7:7:lp:/var/spool/lpd:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh
proxy:x:13:13:proxy:/bin:/bin/sh
www-data:x:33:33:www-data:/var/www:/bin/sh
backup:x:34:34:backup:/var/backups:/bin/sh
list:x:38:38:Mailing List Manager:/var/list:/bin/sh
irc:x:39:39:ircd:/var/run/ircd:/bin/sh
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/bin/sh
nobody:x:65534:65534:nobody:/nonexistent:/bin/sh
libuuid:x:100:101::/var/lib/libuuid:/bin/sh
postfix:x:101:104::/var/spool/postfix:/bin/false
sshd:x:102:65534::/var/run/sshd:/usr/sbin/nologin
mysql:x:103:108:MySQL Server,,,:/var/lib/mysql:/bin/false
$

Trier le fichier sans aucune option.
Le fichier est trié en fonction de la première lettre de chaque ligne.

$ sort /etc/passwd
backup:x:34:34:backup:/var/backups:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
games:x:5:60:games:/usr/games:/bin/sh
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/bin/sh
irc:x:39:39:ircd:/var/run/ircd:/bin/sh
libuuid:x:100:101::/var/lib/libuuid:/bin/sh
list:x:38:38:Mailing List Manager:/var/list:/bin/sh
lp:x:7:7:lp:/var/spool/lpd:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
mysql:x:103:108:MySQL Server,,,:/var/lib/mysql:/bin/false
news:x:9:9:news:/var/spool/news:/bin/sh
nobody:x:65534:65534:nobody:/nonexistent:/bin/sh
postfix:x:101:104::/var/spool/postfix:/bin/false
proxy:x:13:13:proxy:/bin:/bin/sh
root:x:0:0:root:/root:/bin/bash
sshd:x:102:65534::/var/run/sshd:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
sys:x:3:3:sys:/dev:/bin/sh
uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh
www-data:x:33:33:www-data:/var/www:/bin/sh
$

Trier le fichier sur le 3ème champ (valeurs numériques).
Le tri est alphanumérique.

$ sort -t: -k 3,3 /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh
libuuid:x:100:101::/var/lib/libuuid:/bin/sh
postfix:x:101:104::/var/spool/postfix:/bin/false
sshd:x:102:65534::/var/run/sshd:/usr/sbin/nologin
mysql:x:103:108:MySQL Server,,,:/var/lib/mysql:/bin/false
proxy:x:13:13:proxy:/bin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
www-data:x:33:33:www-data:/var/www:/bin/sh
backup:x:34:34:backup:/var/backups:/bin/sh
list:x:38:38:Mailing List Manager:/var/list:/bin/sh
irc:x:39:39:ircd:/var/run/ircd:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/bin/sh
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
nobody:x:65534:65534:nobody:/nonexistent:/bin/sh
lp:x:7:7:lp:/var/spool/lpd:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
$

Pour que le tri soit numérique il faut ajouter l'option -n

$ sort -t: -k 3,3 -n /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
lp:x:7:7:lp:/var/spool/lpd:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh
proxy:x:13:13:proxy:/bin:/bin/sh
www-data:x:33:33:www-data:/var/www:/bin/sh
backup:x:34:34:backup:/var/backups:/bin/sh
list:x:38:38:Mailing List Manager:/var/list:/bin/sh
irc:x:39:39:ircd:/var/run/ircd:/bin/sh
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/bin/sh
libuuid:x:100:101::/var/lib/libuuid:/bin/sh
postfix:x:101:104::/var/spool/postfix:/bin/false
sshd:x:102:65534::/var/run/sshd:/usr/sbin/nologin
mysql:x:103:108:MySQL Server,,,:/var/lib/mysql:/bin/false
nobody:x:65534:65534:nobody:/nonexistent:/bin/sh
$

Exemple de tri sur un fichier dont le champ servant de critère de tri est alphanumérique et complété avec des espaces à gauche.

$ cat listeFic
-rw-r--r-- 1 root root 17 May 17 21:31       fic1
-rw-r--r-- 1 root root 17 May 17 21:36       fic4
-rw-r--r-- 1 root root 23 May 17 21:33       fic2
-rw-r--r-- 1 root root 35 May 19 15:02       fic7
-rw-r--r-- 1 root root 36 May 17 21:52       fic5
-rw-r--r-- 1 root root 40 May 17 21:33       fic3
-rw-r--r-- 1 root root 48 May 19 17:59       fic8
-rw-r--r-- 1 root root 74 May 17 22:01   fic6.txt
$

Tri sur le champ 9. Valeurs alphanumériques complétées avec des espaces à gauche. Sans l'option -b, le tri est mal réalisé.

$ sort -k 9,9 listeFic
-rw-r--r-- 1 root root 17 May 17 21:31       fic1
-rw-r--r-- 1 root root 23 May 17 21:33       fic2
-rw-r--r-- 1 root root 40 May 17 21:33       fic3
-rw-r--r-- 1 root root 17 May 17 21:36       fic4
-rw-r--r-- 1 root root 36 May 17 21:52       fic5
-rw-r--r-- 1 root root 35 May 19 15:02       fic7
-rw-r--r-- 1 root root 48 May 19 17:59       fic8
-rw-r--r-- 1 root root 74 May 17 22:01   fic6.txt
$

Idem mais avec l'option -b

$ sort -b -k 9,9 listeFic
-rw-r--r-- 1 root root 17 May 17 21:31       fic1
-rw-r--r-- 1 root root 23 May 17 21:33       fic2
-rw-r--r-- 1 root root 40 May 17 21:33       fic3
-rw-r--r-- 1 root root 17 May 17 21:36       fic4
-rw-r--r-- 1 root root 36 May 17 21:52       fic5
-rw-r--r-- 1 root root 74 May 17 22:01   fic6.txt
-rw-r--r-- 1 root root 35 May 19 15:02       fic7
-rw-r--r-- 1 root root 48 May 19 17:59       fic8
$

Utilisation de 2 critères de tri: Tri sur le champ 7 (numérique) et sur le champ 9 (alphanumérique)

$ sort -k 7n,7 -k 9b,9 listeFic
-rw-r--r-- 1 root root 74 May 15 22:01   fic6.txt
-rw-r--r-- 1 root root 35 May 15 15:02       fic7
-rw-r--r-- 1 root root 17 May 17 21:31       fic1
-rw-r--r-- 1 root root 23 May 17 21:33       fic2
-rw-r--r-- 1 root root 40 May 17 21:33       fic3
-rw-r--r-- 1 root root 17 May 17 21:36       fic4
-rw-r--r-- 1 root root 36 May 17 21:52       fic5
-rw-r--r-- 1 root root 48 May 19 17:59       fic8
$

Trier un fichier suivant les mois de l'année

$ cat fic91
April
August
December
February
January
July
June
March
May
November
October
September
$

$ sort -M fic91
January
February
March
April
May
June
July
August
September
October
November
December
$

Etiquettes: 

paste

La commande paste concatène les lignes de même niveau des fichiers passés en argument. Avec l'option -s, chaque fichier est traité de manière indépendante et verra toutes ses lignes concaténées en une seule. Les éléments concaténés sont séparés par une tabulation.

Syntaxe

paste [options] [fichiers ...]
Principales options :
-s : Concaténer toutes les lignes en une seule
-d listesep : Les caractères cités dans listesep seront utilisés pour séparer les champs en sortie

Exemple

Exemple avec 2 fichiers contenant les dépenses d'un ménage pour le mois de janvier 2012 et février 2012. Les catégories sont mentionnées dans le même ordre.

$ cat janvier2012
Alimentation    50.00
Eau             25.00
Electricite     123.50
Loyer           456.90
Assurances      234.00
 
$ cat fevrier2012
Alimentation    67.00
Eau             34.00
Electricite     156.00
Loyer           456.90
Assurances      225.00
$

Mettre sur la même ligne les montants de chaque catégorie.

$ paste janvier2012 fevrier2012
Alimentation    50.00   Alimentation    67.00
Eau             25.00   Eau             34.00
Electricite     123.50  Electricite     156.00
Loyer           456.90  Loyer           456.90
Assurances      234.00  Assurances      225.00
$

Retirer la 3ème colonne et ajouter des en-têtes de colonnes et le total pour chaque mois.

$ paste janvier2012 fevrier2012 | awk 'BEGIN{printf("%-15s\t%7s\t%7s\n","POSTE","JANVIER","FEVRIER")}{printf("%-15s\t%7.2f\t%7.2f\n",$1,$2,$4);jan+=$2;fev+=$4}END{printf("%-15s\t%7.2f\t%7.2f\n","TOTAL",jan,fev)}'
POSTE           JANVIER FEVRIER
Alimentation      50.00   67.00
Eau               25.00   34.00
Electricite      123.50  156.00
Loyer            456.90  456.90
Assurances       234.00  225.00
TOTAL            889.40  938.90
$

Concaténer toutes les lignes en une seule.

$ paste -s janvier2012 fevrier2012
Alimentation    50.00   Eau             25.00   Electricite     123.50  Loyer           456.90  Assurances      234.00
Alimentation    67.00   Eau             34.00   Electricite     156.00  Loyer           456.90  Assurances      225.00
$

Etiquettes: 

split

La commande split permet d'éclater un fichier en fragments. Chaque fragment étant stocké dans des fichiers nommés PREFIXEaa, PREFIXEab, ... PREFIXE ayant pour valeur par défaut "x". Si aucun nom de fichier n'est spécifié, l'entrée standard est utilisée.

Syntaxe

split [options] [fichiers ... [prefixe]]
Principales options :
-b nb : Le fichier est éclaté tous les "nb" octets
-l nb : Le fichier est éclaté toutes les "nb" lignes

Exemples

Exemple avec un fichier contenant 9 lignes

$ cat fic10
ligne1
ligne2
ligne3
ligne4
ligne5
ligne6
ligne7
ligne8
ligne9
$

Eclater le fichier en différents fichiers de 3 lignes chacuns. Par défaut, chaque fichier généré sera préfixé par la lettre "x".

$ split -l3 fic10
$ ls -l x*
-rw-r--r-- 1 root root 21 May 23 08:56 xaa
-rw-r--r-- 1 root root 21 May 23 08:56 xab
-rw-r--r-- 1 root root 21 May 23 08:56 xac
$ cat xaa
ligne1
ligne2
ligne3
$ cat xab
ligne4
ligne5
ligne6
$ cat xac
ligne7
ligne8
ligne9
$

Modifier le préfixe des fichiers générés.

$ split -l3 fic10 fichier
$ ls -l fichier*
-rw-r--r-- 1 root root 21 May 23 08:58 fichieraa
-rw-r--r-- 1 root root 21 May 23 08:58 fichierab
-rw-r--r-- 1 root root 21 May 23 08:58 fichierac
$

Etiquettes: 

Transformation de caractères : tr

La commande tr permet d'appliquer un traitement sur certains caractères d'un flux de données : suppression, substitutions ... Cette commande exploite uniquement les données arrivant sur l'entrée standard.

Syntaxe

tr [options] ensemble1 [ensemble2]
Principale option :
[-d caractères] : La liste des caractères qui doivent être supprimés du flux de données.

Substitution de caractères

Deux ensembles de caractères doivent être spécifiés. Chaque ensemble comporte le même nombre de caractères. Tout caractère de ensemble1 trouvé dans le flux de données est substitué par le caractère de même position situé dans ensemble2.

Exemples

La chaine abcd est traitée : chaque caractère b est remplacé par 2 et chaque caractère d est remplacé par 4.

$ echo abcd | tr bd 24
a2c4
$

Il est possible d'utiliser la notion d'intervalles de caractères en utilisant des crochets. Ici chaque minuscule est remplacée par une majuscule correspondante :

$ echo abcd | tr "[a-z]" "[A-Z]"
ABCD
$

Pour traiter un fichier, il faut utiliser la redirection :

$ cat fic1
ceci est un test
$ tr "[a-z]" "[A-Z]" < fic1
CECI EST UN TEST
$

Suppression de caractères

L'option -d permet de supprimer certains caractères du flux de données.

Exemples

Transformation d'un fichier au format DOS (fin de lignes "\r\n") en un format UNIX ("\n"). Retrait du caractère "\r" :

$ od -c fic100
0000000   c   e   c   i       e   s   t       u   n       t   e   s   t
0000020  \r  \n
0000022
$ tr -d '\r' < fic100 > fic101
$ od -c fic101
0000000   c   e   c   i       e   s   t       u   n       t   e   s   t
0000020  \n
0000021
$

En ajoutant l'option -c à l'option -d, la commande supprime tous les caractères non présents dans la liste passée en argument :

$ echo "Linux Pratique HS N°26 – Février/Mars 2013 – En kiosque" | tr -dc a-zA-Z; echo
LinuxPratiqueHSNFvrierMarsEnkiosque

La dernière commande echo permet uniquement d'afficher un retour à la ligne.

Etiquettes: 

Dédoublonnage : uniq

La commande uniq permet de dédoublonner les lignes d'un fichier. Seules les lignes identiques consécutives sont traitées. Elle s'utilise le plus souvent à la suite de la commande sort. Le résultat est stocké dans un fichier de sortie, si celui-ci est spécifié, sur la sortie standard dans le cas contraire.

Syntaxe

uniq [options] [fichier_entree [fichier_sortie]]
Principales options :
-d : Affichage des doublons
-c : Comptage des doublons

Exemples

Le fichier fic20 contient des lignes en double

$ cat fic20
ceci est un test
ceci est un test
ceci est un test
ceci est un test
ceci est un autre test
ceci est un test
ceci est un autre test
ceci    est     un      test
ceci est un     test
et un   autre test
ceci est un fichier
$

Le fichier doit être trié pour que les lignes identiques soient consécutives :

$ sort fic20
ceci est un autre test
ceci est un autre test
ceci est un fichier
ceci est un test
ceci est un test
ceci est un test
ceci est un test
ceci est un test
ceci est un     test
ceci    est     un      test
et un   autre test
$

Et enfin, suppression des doublons :

$ sort fic20 | uniq
ceci est un autre test
ceci est un fichier
ceci est un test
ceci est un     test
ceci    est     un      test
et un   autre test
$

Résultat identique avec la commande sort et l'option -u :

$ sort -u fic20
ceci est un autre test
ceci est un fichier
ceci est un test
ceci est un     test
ceci    est     un      test
et un   autre test
$

Afficher devant chaque ligne son nombre d'occurences dans le fichier :

$ sort fic20 | uniq -c
      2 ceci est un autre test
      1 ceci est un fichier
      5 ceci est un test
      1 ceci est un     test
      1 ceci    est     un      test
      1 et un   autre test
$

Afficher uniquement les lignes ayant des doublons :

$ sort fic20 | uniq -d
ceci est un autre test
ceci est un test
$

Combinées les options -c et -d :

$ sort fic20 | uniq -cd
      2 ceci est un autre test
      5 ceci est un test
$

Afficher les lignes uniques :

$ sort fic20 | uniq -u
ceci est un fichier
ceci est un     test
ceci    est     un      test
et un   autre test
$ sort fic20 | uniq -cu
      1 ceci est un fichier
      1 ceci est un     test
      1 ceci    est     un      test
      1 et un   autre test
$

Etiquettes: