Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 17/07/2016, à 02:38

Swiss_Knight

grep -n zeros supplémentaires sur le numéro de ligne ?

Salut,

le man de grep dit ceci :

              -n, --line-number
              Prefix each line of output with the 1-based line number within
              its input file.

et c'est tout.

J'aimerais savoir s'il est possible d'ajouter des zéros devant le numéro de ligne qui sort avec l'option -n.
Par exemple, au lieu d'un truc du genre :

$ grep -n "truc" foo
foo:8: trucbidule
foo:12: trucchose
foo:177: trucmuche

Je rêve de ça :

$ grep -n "truc" foo
foo:008: trucbidule
foo:012: trucchose
foo:177: trucmuche

Merci.

Dernière modification par Swiss_Knight (Le 17/07/2016, à 02:56)


xuniL

Hors ligne

#2 Le 17/07/2016, à 03:18

MicP

Re : grep -n zeros supplémentaires sur le numéro de ligne ?

Bonjour

Je ne sais pas si c'est possible avec grep mais avec awk :

awk '/truc/ {printf "%s:%03d: %s\n", FILENAME, NR, $0}' foo

Avec ça, ça devrait aller tant que le fichier ne dépasse pas 999 lignes

Pour un max de 9999 lignes, tu change %03d en %04d

Dernière modification par MicP (Le 17/07/2016, à 05:35)

Hors ligne

#3 Le 17/07/2016, à 11:02

Swiss_Knight

Re : grep -n zeros supplémentaires sur le numéro de ligne ?

Hello,
et pour ~45 millions de lignes ça marche aussi ?

Hmm, sinon je pense rester sur grep en fait (je me suis mal exprimé), j'ai des trucs bien compliqués dans ce fichier, il n'y a pas de réel encolonnement.
Je préfère prendre le problème dans l'autre sens en fait... :

grep -n "mes expressions compliquée" foo > bar

Et ensuite faire un tri uniquement sur les nombres dans bar : or là je sais d'avance combien de digits auront les numéros de lignes, par exemple N :
123....N

Et bien tous les les nombres dont la longueur est inférieure à N, il devraient être complétés par autant de zéros que nécessaires devant.

Et je sais aussi qu'ils sont entourés de deux fois deux-points (et que normalement c'est le seul endroit dans l'output où il y a cette séquence : "deuxpoints-chiffre-deuxpoints" (sans espaces ni tirets) :

nomdufichier:2: .................................
nomdufichier:8: .................................
nomdufichier:20: .................................
nomdufichier:127: .................................

etc.
À transformer en :

nomdufichier:002: .....................................
nomdufichier:008: .....................................
nomdufichier:020: .....................................
nomdufichier:127: .....................................

Voilà smile

Dernière modification par Swiss_Knight (Le 17/07/2016, à 11:17)


xuniL

Hors ligne

#4 Le 17/07/2016, à 11:18

jplemoine

Re : grep -n zeros supplémentaires sur le numéro de ligne ?

Et tu les numérotes sur 3 chiffres ? !!


Membre de l'ALDIL (Association Lyonnaise pour le Développement de l'Informatique Libre)
- En pro, après 20 ans de développement, administrateur Linux / Unix depuis Avril 2019.
- En privé, sous Ubuntu-Xubuntu depuis 2009.

Hors ligne

#5 Le 17/07/2016, à 11:36

credenhill

Re : grep -n zeros supplémentaires sur le numéro de ligne ?

hello

$ awk 'BEGIN {FS=OFS=":"} {$2=sprintf("%03d", $2); print}' fichier
nomdufichier:002: .................................
nomdufichier:008: .................................
nomdufichier:020: .................................
nomdufichier:127: .................................

Hors ligne

#6 Le 17/07/2016, à 11:52

pingouinux

Re : grep -n zeros supplémentaires sur le numéro de ligne ?

Bonjour,
La suggestion de MicP en #2 me semble donner le résultat directement. Tu peux calculer auparavant la longueur du fichier et en déduire le nombre de chiffres nécessaires.

lon=$(wc -c <<<$(wc -l foo|cut -d\  -f1)); ((lon--))
awk "/truc/ {printf \"%s:%0*d: %s\n\", FILENAME, $lon, NR, \$0}" foo

Ajouté : Un peu plus simple pour la seconde commande

awk '/truc/ {printf "%s:%0*d: %s\n", FILENAME, '$lon', NR, $0}' foo

Dernière modification par pingouinux (Le 17/07/2016, à 12:02)

Hors ligne

#7 Le 17/07/2016, à 12:31

MicP

Re : grep -n zeros supplémentaires sur le numéro de ligne ?

Swiss_Knight a écrit :

…et pour ~45 millions de lignes ça marche aussi ?…

J'ai l'impression qu'en rédigeant ton message tu étais un peu irrité, et si ce sont mes réponses qui ont provoqué ça, j'en suis désolé.

En réponse à ta question, je dirais que ça fonctionnera correctement pour un fichier contenant 45000000 de lignes et un maximum 99999999 lignes à condition que tu mette %08d ou que tu utilise la solution proposée par pingouinux ou credenhill.

Mais si tu tiens à utiliser grep, je pense qu'il te faudra en plus utiliser une commande supplémentaire pour reformater les sorties de grep,
et pour un fichier de 45000000 lignes, ça va sans doute prendre… un certain temps.

NOTE @ credenhill  pingouinux et jplemoine
J'utilise debian (jessie) et avec awk j'ai dû utiliser FILENAME pour que le nom du fichier soit affiché dans le premier champ des lignes retournées par la commande.
Le nom du fichier ne s'affiche pas non plus avec grep, mais ça ne m'a jamais dérangé.

Dernière modification par MicP (Le 17/07/2016, à 13:05)

Hors ligne

#8 Le 17/07/2016, à 13:37

pingouinux

Re : grep -n zeros supplémentaires sur le numéro de ligne ?

Micp #7 a écrit :

Le nom du fichier ne s'affiche pas non plus avec grep, mais ça ne m'a jamais dérangé.

Le nom s'affiche lorsqu'il y a plusieurs fichiers. S'il n'y en a qu'un seul, tu peux forcer l'affichage avec le paramètre -H.

Hors ligne

#9 Le 17/07/2016, à 14:35

MicP

Re : grep -n zeros supplémentaires sur le numéro de ligne ?

@pingouinux Merci pour l'info smile

Effectivement, je me demandais bien aussi quel était l'intérêt d'afficher le nom du seul fichier donné en paramètre, du coup, je n'ai même pas cherché dans la page man, d'autant que j'avais décidé finalement d'utiliser awk.

Hors ligne

#10 Le 17/07/2016, à 20:15

Swiss_Knight

Re : grep -n zeros supplémentaires sur le numéro de ligne ?

@MicP non désolé, j'étais un peu pressé ce matin big_smile c'était pas du tout le cas, j'avais (un peu trop big_smile ) rapidement besoin de savoir si c'était robuste par rapport au nombres de lignes total du fichier étant donné que je n'ai presque aucune maîtrise sur celui-ci et qu'il peut très très vite gonfler !

J'ai aussi trouvé un truc sympa avec sedq : -w <- ça rajoute des zéros comme il faut aussi. (édité ; c'est bien seq et pas sed)

Dernière modification par Swiss_Knight (Le 17/07/2016, à 21:35)


xuniL

Hors ligne

#11 Le 17/07/2016, à 20:28

MicP

Re : grep -n zeros supplémentaires sur le numéro de ligne ?

…@MicP non désolé…

Aucun souci : Un peu de fatigue, et me voilà en train de prendre tout de travers…  lol

=======

…sed : -w <- ça rajoute des zéros comme il faut aussi.…

Cool, je ne connaissait pas. Merci pour l'info smile

Hors ligne

#12 Le 17/07/2016, à 20:35

pingouinux

Re : grep -n zeros supplémentaires sur le numéro de ligne ?

Swiss_Knight #10 a écrit :

J'ai aussi trouvé un truc sympa avec sed : -w <- ça rajoute des zéros comme il faut aussi.

Peux-tu montrer un exemple d'utilisation ? L'option -w n'apparaît pas dans le man de ma version de sed (sed (GNU sed) 4.2.2).

Hors ligne

#13 Le 17/07/2016, à 21:35

Swiss_Knight

Re : grep -n zeros supplémentaires sur le numéro de ligne ?

Pardon, je suis aussi très fatigué là... c'était seq -w dont je voulais parler ! smile


xuniL

Hors ligne

#14 Le 17/07/2016, à 22:02

MicP

Re : grep -n zeros supplémentaires sur le numéro de ligne ?

…seq -w…

Ah oui, je comprends mieux, c'est vrai que seq est sympa
il y a même bash qui fait ça aussi :

echo {0..10}
0 1 2 3 4 5 6 7 8 9 10

echo {00..10}
00 01 02 03 04 05 06 07 08 09 10

echo {000..010}
000 001 002 003 004 005 006 007 008 009 010

echo fich_{00..10}.txt
fich_00.txt fich_01.txt fich_02.txt fich_03.txt fich_04.txt fich_05.txt fich_06.txt fich_07.txt fich_08.txt fich_09.txt fich_10.txt

Dernière modification par MicP (Le 17/07/2016, à 22:02)

Hors ligne

#15 Le 18/07/2016, à 08:44

credenhill

Re : grep -n zeros supplémentaires sur le numéro de ligne ?

aussi seq

$ seq -f "%03g" 1 10
001
002
003
004
005
006
007
008
009
010

bizarrement, il refuse %d

Hors ligne