Shell compter caractère de chaque ligne
Résolu
Jules
-
Utilisateur anonyme -
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 ...
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:
- Shell compter caractère de chaque ligne
- Caractère ascii - Guide
- Classic shell - Télécharger - Personnalisation
- Caractère spéciaux - Guide
- Partage de photos en ligne - Guide
- Caractere speciaux - Guide
4 réponses
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 :)
utiliser awk qui parcour un fichier ligne par ligne et le traite avec la méthode length
$0 désigne une ligne :)
Jules
Merci ! j'avais po pensé au awk ... j'espère que vous aurez apprécié ma solution tortueuse lol
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 ;-)
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
Salut,
while read ligne;do echo $ligne| wc -c;done < fichier.txt
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
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
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.
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.
Salut,
pas besoin de awk pour faire ça
pas besoin de awk pour faire ça
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. :)
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. :)