Shell compter caractère de chaque ligne

Résolu
Jules -  
 Utilisateur anonyme -
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 2435 Date d'inscription   Statut Membre Dernière intervention   318
 
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
Jules
 
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   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
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   Statut Modérateur Dernière intervention   4 896
 
Tout à fait l'ami ;-))
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
Salut,
while read ligne;do echo $ligne| wc -c;done < fichier.txt
0
Jules
 
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
mehmet110
 
merci lami20j pour dir salut
0
mcoolive
 
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
mcoolive
 
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
 
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   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
Salut,

pas besoin de awk pour faire ça
0
EminoMeneko Messages postés 2435 Date d'inscription   Statut Membre Dernière intervention   318
 
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   Statut Modérateur Dernière intervention   4 896
 
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   Statut Modérateur Dernière intervention  
 
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 2435 Date d'inscription   Statut Membre Dernière intervention   318 > Jules
 
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   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570 > jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention  
 
je n'ai pas dit qu'on ne peux pas utiliser awk ;-)
0