Shell compter caractère de chaque ligne

Résolu/Fermé
Jules - 26 févr. 2008 à 10:03
 Utilisateur anonyme - 28 oct. 2013 à 15:43
Bonjour,

Je cherche une solution pour compter le nombre de caractères sur chaque ligne d'un fichier.

La solution wc me donne le nombre total de lignes et de caractères.

Ainsi la commande head -1 001_OUT_COM_VES_VESR_20080225211443864406.txt | wc -c va me donner le nb de caractère de la ligne 1 par exple.

J'ai tenté de m'orienter vers la solution
while read ligne ; do wc -c $ligne ; done < 001_OUT_COM_VES_VESR_20080225211443864406.txt

Mais, la commande interprete la variable $ligne comme un fichier. Est il possible de préciser que ce sont les caractères de la variable en sortie qu'il faut compter ?

Une autre solution serait de faire une boucle de type head -"x" fiicher | tail -"x-1" avec un renvoi vers un fichier temporaire dans lequel je compte le nb de caractères mais la solution me semble tortueuse ...

Est-ce que vous pouvez me suggérer une solution moins contraignante ?

Merci d'avance

Ps : j'ai hésité à mettre ce post dans programmation ...
A voir également:

4 réponses

EminoMeneko Messages postés 2434 Date d'inscription jeudi 24 janvier 2008 Statut Membre Dernière intervention 23 mai 2018 318
26 févr. 2008 à 10:14
man awk ça aide. :)

utiliser awk qui parcour un fichier ligne par ligne et le traite avec la méthode length

$0 désigne une ligne :)
6
Merci ! j'avais po pensé au awk ... j'espère que vous aurez apprécié ma solution tortueuse lol
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
26 févr. 2008 à 11:32
en fait ce qui est important c'est qu'il y a plusieurs solutions
et vu ma paresse, bien sûr que je preferereais celle avec awk, puisqu'elle est trop courte

pour s'amuser voici encore des solutions, cette fois avec perl ;-)
perl -ne 'print length,"\n"' fichier.txt
perl -ne 'print scalar(map {/./sg} $_),"\n"' fichier.txt
perl -ne '$n=1;s/./++$n/eg;print $n,"\n"' fichier.txt
3
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 894
26 févr. 2008 à 11:35
Tout à fait l'ami ;-))
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
26 févr. 2008 à 10:12
Salut,
while read ligne;do echo $ligne| wc -c;done < fichier.txt
0
Merci lami20j (si c'est bien ton vrai nom :-) )
Cette me retourne des résultats incorrects :

head -1 fichier.txt
007121049191 xx xxxxxxxxxx xxxxxxx etc .......


$ head -1 fichier.txt | wc -c
262
(262 caractères sur la 1ere ligne)

Ta commande me retourne :
19
74
73
83
73


Ma solution tortueuse :

NB_LIGNES=`wc -l $1|awk -F \ '{print $1}'`
#echo "Le fichier $1 contient $NB_LIGNES lignes"
NUM_LIGNE=1
until [ "$NUM_LIGNE" = "$NB_LIGNES" ]
do
NB_CARACTERES=`head -$NUM_LIGNE $1 |tail -1|wc -c`
echo "La ligne $NUM_LIGNE contient $NB_CARACTERES caracteres"
NUM_LIGNE=`expr $NUM_LIGNE + 1`
done

echo "La ligne $NUM_LIGNE contient $NB_CARACTERES caracteres"


verif_longueur.ksh fichier.txt :
La ligne 1 contient 262 caracteres
La ligne 2 contient 262 caracteres
La ligne 3 contient 262 caracteres
La ligne 4 contient 262 caracteres
La ligne 5 contient 262 caracteres


Je vais m'orienter vers le awk peut-être
0
merci lami20j pour dir salut
0
Cette solution est intéressante car elle ne dépend pas de programme externe qui ne sont as forcement présent (même si perl ou awk sont presque toujours installés).
Mais il y a deux erreurs de programmation : la ligne peut contenir des espaces consécutifs, pour les préserver il faut protéger $ligne avec des quotes. La commande echo rajoute un retour chariot, donc ça fait + 1 sur chaque ligne...
echo $ligne| wc -c
Doit devenir: echo -n "$ligne" | wc -c

Malheureusement l'option -n n'est pas portable sur tous les shell. On peut s'y prendre encore autrement en faisant un "moins 1"... mais c'est ch... embêtant. Surtout que faire un "moins 1" portable est assez verbeux aussi.
0
En lisant le commentaire suivant ^^ on peut faire
> wc -L <<<"$ligne"

Ca résout mon problème de "moins 1". Mais je redis qu'il faut des guillemets autour de la variable, c'est la raison principale du problème observé plus haut.
0
Utilisateur anonyme
28 oct. 2013 à 15:43
salut,

Pas besoin de programme externe.
le shell connaît le nombre de caractère d'une variable.

while read line; do echo "\"$line\" : ${#line} chars"; done <fichier
"a b c" : 5 chars
"def" : 3 chars
"gh i" : 4 chars
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
26 févr. 2008 à 10:17
Salut,

pas besoin de awk pour faire ça
0
EminoMeneko Messages postés 2434 Date d'inscription jeudi 24 janvier 2008 Statut Membre Dernière intervention 23 mai 2018 318
26 févr. 2008 à 10:35
Oui mais ça reste une solution. En tout cas la tienne à l'air très bien. :)
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 894
26 févr. 2008 à 10:50
Salut lami20j,

pas besoin de awk pour faire ça
Si si awk est très bien pour ça :
awk '{ print length($0) }' fichier
;-))
0
Jules > jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020
26 févr. 2008 à 10:54
Ooooooooooooooooooooh quelle est belle cette solution !

Merci !!!!!

Par contre, ça ne compte pas le caractère de retour de fin de ligne ... mais ça n'a pas d'importance pour moi.

Encore merci.
0
EminoMeneko Messages postés 2434 Date d'inscription jeudi 24 janvier 2008 Statut Membre Dernière intervention 23 mai 2018 318 > Jules
26 févr. 2008 à 11:13
T'as vu ça j'suis pas étudiant en info système réseau pour rien lol. Et niveau shell script awk est un petit peu au centre de tout avec sed mais bien sûr je préfère awk de très loin héhé :) enfin bon j'ai pas laché la soluce comme ça non plus désolé. :/
Mais j'ai un peu mis sur la voie.

Le cours le plus important à retenir RTFM. En gros sous nux ça se résume souvent à man. :)
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567 > jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020
26 févr. 2008 à 11:13
je n'ai pas dit qu'on ne peux pas utiliser awk ;-)
0