#1 Le 12/10/2017, à 08:29
- thurston
[RESOLU] Contenu d'un fichier texte rangé dans fichiers A.txt, B.txt
Bonjour,
J'ai un besoin actuel d'un petit script qui permettrait d’extraire le contenu d'une liste d'un fichier texte, et de le ranger dans des fichiers créés en fonction de la première lettre de chaque ligne du fichier initial.
Je me suis dit que peut etre quelqu'un avait déjà créer ce genre de fichier. Je ne suis pas très à l'aise avec bash, meme si ca me parait assez simple. Si jamais, merci d'avance
Pour tout texte contenant un chiffre, il serait placé dans un fichier 123.txt.
Thurston.
Exemple:
fichier.initial une liste de titres de DVD (c'est le but ultime du script)
Aladin et les 40 voleurs
Alibi
Bambi
Zorro
Résulat attendu
A.txt,
Aladin et les 40 voleurs
Alibi
B.txt
Bambi
Z.txt
Zorro
Dernière modification par thurston (Le 12/10/2017, à 10:07)
Hors ligne
#2 Le 12/10/2017, à 08:55
- pingouinux
Re : [RESOLU] Contenu d'un fichier texte rangé dans fichiers A.txt, B.txt
Bonjour,
#!/bin/bash
while read tit
do
c=${tit:0:1}
echo "$tit" >>"$c.txt"
done <fichier.initial
Pour tout texte contenant un chiffre, il serait placé dans un fichier 123.txt.
Je ne comprends pas ton exemple, car le 40 du premier fichier n'a pas changé sa destination.
Hors ligne
#3 Le 12/10/2017, à 08:58
- Watael
Re : [RESOLU] Contenu d'un fichier texte rangé dans fichiers A.txt, B.txt
salut,
le but est donc de
lire chaque ligne du fichier
récupérer le premier caractère de la ligne en cours
tester si c'est un nombre
alors ajouter la ligne à 123.txt
ou ajouter la ligne à "premierCaractère".txt
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#4 Le 12/10/2017, à 09:56
- kholo
Re : [RESOLU] Contenu d'un fichier texte rangé dans fichiers A.txt, B.txt
salut,
en 8 lettres,... ou le compte est bon...
un fichier initial :
Aladin et les 40 voleurs
Alibi
Bambi
Zorro
123 un film en nombre
- un caractère inconnu
(qui vous offre des fleurs)
star whores (autre version...)
code version longue :
fileInitial="$(< "fichier.initial")"
IFS=$'\n' fileInitial=( $fileInitial )
for ligne in ${fileInitial[@]}
do
premLettre=${ligne:0:1}
premLettre="${premLettre^^}" # première lettre en maj
case $premLettre in
[0-9]) fichOUT="123.txt"
;;
# [a-z]|[A-Z]) fichOUT="$premLettre.txt" # pas la peine puisque première lettre en maj
# ;;
[A-Z]) fichOUT="$premLettre.txt"
;;
*) fichOUT="NC.txt"
# echo "quezaco : $premLettre ?"
;;
esac
# echo "Vérif : $ligne
# premLettre=$premLettre
# fichOUT=$fichOUT"
if [ ! -f "$fichOUT" ]; then > "$fichOUT" ; fi
echo "$ligne" >> "$fichOUT"
done
exit 0
Hors ligne
#5 Le 12/10/2017, à 10:01
- thurston
Re : [RESOLU] Contenu d'un fichier texte rangé dans fichiers A.txt, B.txt
Merci vraiment à tous, je commence à tester vos propositions, tout fonctionne bien et ca colle exactement avec mon besoin.
Je pense que ma demande est d'ores et déjà résolue.
Encore merci, je viens de gagner pas mal de temps grace à vous, et éviter l'écriture d'un code horrible, grace à vos inputs.
A+
Thurston
Dernière modification par thurston (Le 12/10/2017, à 10:08)
Hors ligne
#6 Le 12/10/2017, à 11:46
- Watael
Re : [RESOLU] Contenu d'un fichier texte rangé dans fichiers A.txt, B.txt
allez, kholo ! encore un effort pour faire plus inutilement compliqué.
Dernière modification par Watael (Le 12/10/2017, à 11:46)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#7 Le 13/10/2017, à 08:58
- kholo
Re : [RESOLU] Contenu d'un fichier texte rangé dans fichiers A.txt, B.txt
merci de me reprendre chaque fois Watael...
j'arrive pas à me dire qu'une variable est un tableau tant que je ne l'ai pas défini explicitement...
c'est dans la tête...
je passe mon temps à chercher comment le séparateur peut être reconnu...
là c'est un manque complet de culture,...
je devrais prendre le temps pour des cours
je suis un peu ton elleji !!!
edit ... oups, j'oubliais :
je ne sais finalement pas ce qui te semble le plus lourd...
mon utilisation abusive de ma forme pour passer un fichier texte en tableau
ou le case que je met systématiquement quand j'ai plus de deux tests
ou les trucs purement inutiles comme certaines lignes ou création de variables...
note que pour une fois j'ai pas mis de fonctions de partout !
ma version, je pense, corrigée
#!/bin/bash
while read ligne
do
premLettre=${ligne:0:1}
case ${premLettre} in
[0-9]) echo "$ligne" >> "123.txt" ;;
[a-z]|[A-Z]) echo "$ligne" >> "${premLettre^^}.txt" ;;
*) echo "$ligne" >> "0_NC.txt" ;;
esac
done <fichier.initial
Dernière modification par kholo (Le 13/10/2017, à 09:16)
Hors ligne
#8 Le 13/10/2017, à 09:55
- credenhill
Re : [RESOLU] Contenu d'un fichier texte rangé dans fichiers A.txt, B.txt
hello
$ awk -F "" '/^[0-9]/ {f="123.txt"} !/^[0-9]/ {f=$1 ".txt"} {print $0 > f}' fichier.initial
Hors ligne
#9 Le 14/10/2017, à 20:25
- thurston
Re : [RESOLU] Contenu d'un fichier texte rangé dans fichiers A.txt, B.txt
> credenhill
impressionnant, et ca fonctionne !
Merci à tous
T
Hors ligne
#10 Le 18/10/2017, à 08:16
- DonutMan75
Re : [RESOLU] Contenu d'un fichier texte rangé dans fichiers A.txt, B.txt
Bonjour à tous,
allez il manquait une solution avec grep ^^
La séquence de lettres est définie par {A..Z}, syntaxe qui n'existe qu'en bash il me semble.
Le problème de ce script est qu'il crée des fichiers de sortie A.txt, B.txt etc... même s'il n'y a aucun titre qui commence par cette lettre...
Mais sinon ça semble marche impec
#! /bin/bash
filein='./liste.txt'
for letter in {A..Z} ; do
grep -iE "^${letter}" ${filein} > ${letter}.txt
done
grep -E "^[0-9]" ${filein} > 123.txt
Bonne journée à tous !
Donut
Hors ligne