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 22/10/2015, à 23:43

cristobal78

[resolu]mettre toute les lignes d'une liste à la même longueur

Bonsoir à tous

A l'aide d'une cde su style : grep "motif-recherché" "list1"    qui va explorer "list1" (une très grande liste de noms de longueur variable) j'extrais une "list2".
Je souhaite maintenant transformer "list2" en "list3" qui serait constituée de tous les noms de "list2" mais tous ayant été tronqués à, par ex., 4 caractères seulement.

exemple
------------
Supposons que la "list2" obtenue après le "grep" soit :

pierre
jacques
florent
brigitte
dominique
...

alors "list3" devrait être :

pier
jacq
flor
brig
domi
....

J'ai cherché avec cut, wc etc... mais je n'ai pas trouvé la bonne idée.
Accessoirement quelle commande donne la longueur (le nombre de car. d'une chaîne de caractère) :

"commande_inconnue" dominique
réponse 9.

a+

Dernière modification par cristobal78 (Le 23/10/2015, à 11:27)


Laptop Lenovo Ubuntu 20.04 LTS / DELL Mint 20.2 - XFCE / Laptop HP Mint 20.2 - XFCE

Hors ligne

#2 Le 23/10/2015, à 00:09

Postmortem

Re : [resolu]mettre toute les lignes d'une liste à la même longueur

Salut,

while read
do
   printf '%.4s\n' "$REPLY" >> list3
done < list2

Édit :
Avec cut, il me semble que c'est ça (mais je peux pas tester) :

cut -c 1-4 list2 > list3

Dernière modification par Postmortem (Le 23/10/2015, à 00:14)


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#3 Le 23/10/2015, à 00:14

MicP

Re : [resolu]mettre toute les lignes d'une liste à la même longueur

…quelle commande donne la longueur (le nombre de car. d'une chaîne de caractère)…

michel@xubu:~$ maVariable="Pierre"
michel@xubu:~$ echo ${#maVariable}
6
michel@xubu:~$ echo ${maVariable:0:4}
Pier
michel@xubu:~$ 

=======
voir aussi, pour les fichiers, l'excellent :

man fmt

Dernière modification par MicP (Le 23/10/2015, à 00:42)

Hors ligne

#4 Le 23/10/2015, à 00:21

Postmortem

Re : [resolu]mettre toute les lignes d'une liste à la même longueur

@MicP :
J'ai jamais utilisé fmt, mais il me semble que ça transformerait :

12345678

En :

1234
5678

Non ??
Moi j'ai compris que le résultat attendu devrait être :

1234

Dernière modification par Postmortem (Le 23/10/2015, à 00:22)


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#5 Le 23/10/2015, à 00:28

MicP

Re : [resolu]mettre toute les lignes d'une liste à la même longueur

Oui, j'avais posté ça très vite, parce que c'est vraiment le must pour formater les fichiers textes, (et donc les listes finales) et j'avais envie d'en parler,
mais je n'avais pas encore finit d'éditer le message, puisque fmt n'est pas vraiment adapté à la demande de cristobal78 qui ne concerne qu'un mot par ligne
Mais je vais retrouver la formulation correspondant plus à ta demande, je crois me souvenir que c'est possible.

Ben en fait, non, je retrouve pas (ça fait tellement longtemps que je ne l'avais pas utilisé que j'ai dû rêver) roll

Désolé.

Dernière modification par MicP (Le 23/10/2015, à 00:49)

Hors ligne

#6 Le 23/10/2015, à 00:31

cristobal78

Re : [resolu]mettre toute les lignes d'une liste à la même longueur

@postmortem

merci tout plein. smile
la ligne avec cut fonctionne apparemment parfaitement bien (sur qques exemples).
Le ligne en while ça à l'air très subtile et j'ai du mal à la "décoder". Qd je l'aurai comprise je pourrais peut être la réutiliser !

@ micp

merci : testé avec succès. smile
Je ne comprends pas cependant le rôle du # et des {}. C'est du regex ?

J'ai aussi été lire le man de fmt mais je ne vois pas ce qu'on peut faire avec.
a+


Laptop Lenovo Ubuntu 20.04 LTS / DELL Mint 20.2 - XFCE / Laptop HP Mint 20.2 - XFCE

Hors ligne

#7 Le 23/10/2015, à 00:33

tiramiseb

Re : [resolu]mettre toute les lignes d'une liste à la même longueur

Salut,

1/ cut -c-4
2/ echo "dominique" | wc -c

Hors ligne

#8 Le 23/10/2015, à 00:45

MicP

Re : [resolu]mettre toute les lignes d'une liste à la même longueur

…Je ne comprends pas cependant le rôle du # et des {}…

Un lien bien sympa en français sur les sous-chaînes de variables en bash

Dernière modification par MicP (Le 23/10/2015, à 05:31)

Hors ligne

#9 Le 23/10/2015, à 00:49

cristobal78

Re : [resolu]mettre toute les lignes d'une liste à la même longueur

Salut tiramiseb

toi d'habitude si rapide tu t'es fait griller par postmortem et micp !! tongue

Donc mon idée d'utiliser wc et cut était bonne et j'aurais sans doute fini par trouver si cette couillonade de man donnait des exemples?
Mais non c'est trop demander.
Parceque renvoyer au man comme je le vois souvent  genre RTFM, c'est bon pour les très forts.
Les débutants eux ne s'y retrouvent pas.

Il suffit de faire :
man find
ou man sed
ou man awk

pour en etre aussitot dégouté.

Tiens au fait le man ça serait pas un wiki par hasard  ???
Si oui pourquoi personne (je parle de gens compétents) ne propose jamais d'exemples simples ???


Laptop Lenovo Ubuntu 20.04 LTS / DELL Mint 20.2 - XFCE / Laptop HP Mint 20.2 - XFCE

Hors ligne

#10 Le 23/10/2015, à 06:54

pingouinux

Re : [resolu]mettre toute les lignes d'une liste à la même longueur

Bonjour,

tiramiseb #5 a écrit :

echo "dominique" | wc -c

Tu vas compter le '\n' final. Il faut utiliser echo -n :

$ echo "dominique" | wc -c
10

$ echo -n "dominique" | wc -c
9

Hors ligne

#11 Le 23/10/2015, à 08:58

credenhill

Re : [resolu]mettre toute les lignes d'une liste à la même longueur

hello
et aussi

$ grep -o '^....' list2
pier
jacq
flor
brig
domi
$ grep -Eo '^.{4}' list2
pier
jacq
flor
brig
domi

Hors ligne

#12 Le 23/10/2015, à 09:08

tiramiseb

Re : [resolu]mettre toute les lignes d'une liste à la même longueur

toi d'habitude si rapide tu t'es fait griller par postmortem et micp !!

Je suis surchargé de travail depuis quelques semaines. Je passais par là car je n'arrivais pas à dormir. smile

pingouinux: bien vu smile

Donc mon idée d'utiliser wc et cut était bonne

Oui. Dans le man de "wc", tu vois clairement :

-m, --chars
              print the character counts

Donc => « wc -m ».
Par contre je t'ai donné "wc -c", c'est une erreur car cela ne prend pas en compte l'encodage utf8, ça compte les octets (comme le dit clairement la page de man).


Et dans le man de "cut" :

-c, --characters=LIST
              select only these characters
[...]
       -M     from first to M'th (included) byte, character or field

Donc => « cut -c -4 »


Parceque renvoyer au man comme je le vois souvent  genre RTFM, c'est bon pour les très forts.
Les débutants eux ne s'y retrouvent pas.

C'est parce que "les débutants" d'aujourd'hui ne veulent pas faire d'efforts.
Lorsque j'ai débuté, c'était bien + "RTFM" qu'aujourd'hui, il n'y avait pas de forum comme celui-ci, il n'y avait pas parrain-linux, il y avait surtout des documentations en anglais... Pourtant, je m'y suis retrouvé et j'ai appris. J'ai faiit l'effort d'essayer de comprendre, c'est tout.

Tiens au fait le man ça serait pas un wiki par hasard  ???

Non, ce sont des documentations écrites par des gens qui sont généralement aussi les développeurs des logiciels.

Hors ligne

#13 Le 23/10/2015, à 09:09

tiramiseb

Re : [resolu]mettre toute les lignes d'une liste à la même longueur

Les autres solutions (grep, printf, etc) fonctionnent bien sûr, mais elles sont plus complexes et probablement plus lentes...

Hors ligne

#14 Le 23/10/2015, à 09:34

Postmortem

Re : [resolu]mettre toute les lignes d'une liste à la même longueur

cristobal78 a écrit :

Le ligne en while ça à l'air très subtile et j'ai du mal à la "décoder". Qd je l'aurai comprise je pourrais peut être la réutiliser !

C'est du pur bash, ça ne fait appel à aucune commande externe.
J'ai proposé ça d'abord car je suis sur mon téléphone et j'ai pas cut d'installé.

while read ligne
do
   Ici
   vont
   des
   commandes
   qui peuvent utiliser
   la variable "$ligne"
done < fichier

Ça permet de faire les commandes pour chaque ligne du fichier.
La ligne est affectée à la variable qu'on donne à "read".
Si on ne spécifie pas de nom de variable, "read" utilise la variable $REPLY.


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#15 Le 23/10/2015, à 10:01

credenhill

Re : [resolu]mettre toute les lignes d'une liste à la même longueur

sans boucle while

$ readarray t < list2; printf "%.4s\n" ${t[@]}
pier
jacq
flor
brig
domi

Hors ligne

#16 Le 23/10/2015, à 10:05

tiramiseb

Re : [resolu]mettre toute les lignes d'une liste à la même longueur

Au risque de me répéter et de répéter Postmortem...

sans boucle while

$ cut -c -4 list2
pier
jacq
flor
brig
domi

Dernière modification par tiramiseb (Le 23/10/2015, à 10:05)

Hors ligne

#17 Le 23/10/2015, à 11:34

cristobal78

Re : [resolu]mettre toute les lignes d'une liste à la même longueur

je vous remercie tous et grâce aux diverses solutions proposées pour une même question je vais pouvoir creuser et comprendre le bash un peu plus.

@ tiramiseb : toujours au sujet du man. Mon pb c'est que j'ai commencé à m'intéresser à linux ... à plus de 60 ans.
Toujours pour toi : super ton domotego que je découvre à l'instant. Je passe l'info autour de moi !


Laptop Lenovo Ubuntu 20.04 LTS / DELL Mint 20.2 - XFCE / Laptop HP Mint 20.2 - XFCE

Hors ligne

#18 Le 23/10/2015, à 11:39

pingouinux

Re : [resolu]mettre toute les lignes d'une liste à la même longueur

S'il y a des accents dans la liste, il est préférable d'utiliser une des commandes de credenhill en #11 (grep).

Hors ligne

#19 Le 23/10/2015, à 11:41

tiramiseb

Re : [resolu]mettre toute les lignes d'une liste à la même longueur

Tiens c'est bizarre, je pensais que cut prendrait bien en compte l'encodage des caractères avec "-c", vu qu'il existe un "-b"...

Hors ligne

#20 Le 23/10/2015, à 11:50

pingouinux

Re : [resolu]mettre toute les lignes d'une liste à la même longueur

J'ai testé avec -c et -b

$ cut -b-4 <<<'érika'
éri

$ cut -b-4 <<<'érika'
éri

Dernière modification par pingouinux (Le 23/10/2015, à 11:51)

Hors ligne

#21 Le 23/10/2015, à 11:51

tiramiseb

Re : [resolu]mettre toute les lignes d'une liste à la même longueur

Oui oui, j'ai testé aussi, tu as raison. Je trouve ça bizarre, c'est tout smile

Hors ligne

#22 Le 23/10/2015, à 11:55

pingouinux

Re : [resolu]mettre toute les lignes d'une liste à la même longueur

Ce n'est effectivement pas logique.

Hors ligne

#23 Le 23/10/2015, à 12:00

cristobal78

Re : [resolu]mettre toute les lignes d'une liste à la même longueur

comme si chaque lettre accentuée comptait double :

cut -c-8 <<<'récupéré'
récupé
 cut -c-10 <<<'récupéré'
récupér
 cut -c-11 <<<'récupéré'
récupéré

Laptop Lenovo Ubuntu 20.04 LTS / DELL Mint 20.2 - XFCE / Laptop HP Mint 20.2 - XFCE

Hors ligne

#24 Le 23/10/2015, à 12:11

tiramiseb

Re : [resolu]mettre toute les lignes d'une liste à la même longueur

Ça, c'est parce qu'UTF-8 encode les caractères accentués sur deux octets.
Et si tu vas chercher des caractères encodés sur 3 octets, ça "coupera" encore plus...

Hors ligne

#25 Le 23/10/2015, à 12:20

cristobal78

Re : [resolu]mettre toute les lignes d'une liste à la même longueur

et apparemment ce pb n'apparait pas avec la solution de Micp au post #2
echo ${variable :0:4}


Laptop Lenovo Ubuntu 20.04 LTS / DELL Mint 20.2 - XFCE / Laptop HP Mint 20.2 - XFCE

Hors ligne