awk
Manipulation des lignes
Recherche…
Extraire des lignes spécifiques d'un fichier texte
Supposons que nous ayons un fichier
cat -n lorem_ipsum.txt
1 Lorem Ipsum is simply dummy text of the printing and typesetting industry.
2 Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book.
3 It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged.
4 It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum
Nous voulons extraire les lignes 2 et 3 de ce fichier
awk 'NR==2,NR==3' lorem_ipsum.txt
Cela va imprimer les lignes 2 et 3:
2 Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book.
3 It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged.
Extraire une colonne / un champ spécifique d'une ligne spécifique
Si vous avez le fichier de données suivant
cat data.csv
1 2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28 29 30
31 32 33 34 35 36 37 38 39 40
41 42 43 44 45 46 47 48 49 50
peut-être vous avez besoin de lire la quatrième colonne de la troisième ligne, ce serait "24"
awk 'NR==3 { print $4 }' data.csv
donne
24
Modification des lignes à la volée (par exemple pour réparer les fins de ligne Windows)
Si un fichier peut contenir des fins de ligne Windows ou Unix (voire un mélange des deux), le remplacement de texte prévu risque de ne pas fonctionner comme prévu.
Échantillon:
$ echo -e 'Entry 1\nEntry 2.1\tEntry 2.2\r\nEntry 3\r\n\r\n' \
> | awk -F'\t' '$1 != "" { print $1 }' \
> | hexdump -c
0000000 E n t r y 1 \n E n t r y 2 .
0000010 1 \n E n t r y 3 \r \n \r \n
000001d
Cela peut être facilement corrigé par une règle supplémentaire qui est insérée au début du script awk:
/\r$/ { $0 = substr($0, 1, length($0) - 1) }
Comme l'action ne se termine pas par next , les règles suivantes sont appliquées comme précédemment.
Exemple (avec correction de fin de ligne):
$ echo -e 'Entry 1\nEntry 2.1\tEntry 2.2\r\nEntry 3\r\n\r\n' \
> | awk -F'\t' '/\r$/ { $0 = substr($0, 1, length($0) - 1) } $1 != "" { print $1 }' \
> | hexdump -c
0000000 E n t r y 1 \n E n t r y 2 .
0000010 1 \n E n t r y 3 \n
000001a
Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow