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 02/04/2017, à 21:12

Compte supprimé

[Résolu] Bash - Fusionner ligne fichier texte jusqu'à un mot clé.

Bonjour,

Voici une question concernant un script bash.

J'ai un fichier texte qui ressemble à ça (pour l'exemple)

1000 toto titi 
tata
1000  toto
titi
tata
1000 toto
titi tata

et j'aimerais avoir ça comme résultat:

1000 toto titi tata
1000 toto titi tata
1000 toto titi tata

En gros chaque fois que l'on rencontre "1000" cela provoque un retour à la ligne.

Merci

Dernière modification par Compte supprimé (Le 02/04/2017, à 21:46)

#2 Le 02/04/2017, à 21:44

Compte supprimé

Re : [Résolu] Bash - Fusionner ligne fichier texte jusqu'à un mot clé.

J'ai trouvé une solution en continuant mes recherches sur internet.

Voici une solution avec awk:

awk '$1=$1' ORS="\n1000 " RS="1000" "fichier.txt"

Dernière modification par Compte supprimé (Le 02/04/2017, à 21:50)

#3 Le 02/04/2017, à 21:52

Watael

Re : [Résolu] Bash - Fusionner ligne fichier texte jusqu'à un mot clé.

salut,

En gros chaque fois que l'on rencontre "1000" cela provoque un retour à la ligne.

plus précisément :
en début de ligne 1000 déclenche la lecture de la ligne suivante jusqu'au prochain 1000 en début de ligne.

l'espace en plus, à la ligne 3, c'est une typo, ou il faut en corriger le format aussi ?

edit :

$ output
1000 toto titi 
tata
1000  toto
titi
tata
1000 toto
titi tata
$ output | awk '$1=$1' ORS="\n1000 " RS="1000"
toto titi tata
1000 toto titi tata
1000 toto titi tata
1000

?

et je croyais avoir lu que tu voulais faire ça en bash.
là, c'est du awk. hmm

Dernière modification par Watael (Le 02/04/2017, à 21:55)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#4 Le 02/04/2017, à 23:41

Compte supprimé

Re : [Résolu] Bash - Fusionner ligne fichier texte jusqu'à un mot clé.

Salut Watael,

Merci pour tes explications ! cool

Watael a écrit :

et je croyais avoir lu que tu voulais faire ça en bash.
là, c'est du awk. hmm

Oui, sauf erreur de ma part on peut utiliser des commandes awk dans du bash, non ?

#5 Le 03/04/2017, à 03:03

Watael

Re : [Résolu] Bash - Fusionner ligne fichier texte jusqu'à un mot clé.

oui, bien sûr, mais s'il n'y a pas de bash, ce n'est pas du bash ! big_smile

quand je lis "script bash", je pense immédiatement "100% full bash". wink
sinon (je ne sais pas trop), c'est du shell. (?)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#6 Le 03/04/2017, à 20:19

Compte supprimé

Re : [Résolu] Bash - Fusionner ligne fichier texte jusqu'à un mot clé.

Bien que j'ai trouvé une solution à mon problème initiale qui fonctionne dans mon script bash (vu que j’utilise au tout début #! /bin/bash, je pense que c'est du bash wink) quelle serai donc la solution si je voudrais le faire en "100% full bash" ?

EDIT:
Dans mon script qui à pour but de convertir des fichiers vidéo et audio, j'utilise awk pour la recherche d'info sur les fichiers, ffmpeg pour la conversion et yad pour l'interface graphique... et là je pense que je ne dois pour faire vraiment du bash.

Après quand je lis cette page: Programmation Bash/Commandes shell, je trouve la bien la commande awk, pour être franc je n'y comprends plus rien ! roll

Dernière modification par Compte supprimé (Le 03/04/2017, à 20:40)

#7 Le 03/04/2017, à 21:52

MicP

Re : [Résolu] Bash - Fusionner ligne fichier texte jusqu'à un mot clé.

Bonsoir

… Bash… J'ai un fichier texte …En gros chaque fois que l'on rencontre "1000" cela provoque un retour à la ligne. …

michel@debg53sw:~$ cat fichierTexte
1000 toto titi 
tata
1000  toto
titi
tata
1000 toto
titi tata
michel@debg53sw:~$ 
michel@debg53sw:~$ for mot in $(<fichierTexte); do [ $mot = 1000 ] && printf '\n%s ' $mot || printf '%s ' $mot; done; printf '\n'

1000 toto titi tata 
1000 toto titi tata 
1000 toto titi tata
michel@debg53sw:~$ 

Le dernier printf '\n' c'est juste pour que mon prompt soit en début de ligne,
tu pourra l'enlever si besoin.

Dernière modification par MicP (Le 03/04/2017, à 22:37)

Hors ligne

#8 Le 03/04/2017, à 22:42

Compte supprimé

Re : [Résolu] Bash - Fusionner ligne fichier texte jusqu'à un mot clé.

Salut MicP

Un grand merci pour ta solution ! cool

#9 Le 03/04/2017, à 23:40

Watael

Re : [Résolu] Bash - Fusionner ligne fichier texte jusqu'à un mot clé.

ah, oui, c'est malin !
+1

ajoute un petit test pour te débarrasser de la première ligne vide.


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#10 Le 04/04/2017, à 08:59

Hizoka

Re : [Résolu] Bash - Fusionner ligne fichier texte jusqu'à un mot clé.

pas mal icP, j'aurais pas pensé aux print, je me serais compliqué la tache à utiliser des variables temporaires.


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#11 Le 06/04/2017, à 11:56

MicP

Re : [Résolu] Bash - Fusionner ligne fichier texte jusqu'à un mot clé.

michel@debg53sw:~$ PasPremierMot=0; for mot in $(<fichierTexte); do [ $PasPremierMot = 1 ] && [ $mot = 1000 ] && printf '\n%s ' $mot || printf '%s ' $mot; PasPremierMot=1; done; printf '\n'
1000 toto titi tata 
1000 toto titi tata 
1000 toto titi tata 
michel@debg53sw:~$ 

Hors ligne

#12 Le 06/04/2017, à 15:33

Watael

Re : [Résolu] Bash - Fusionner ligne fichier texte jusqu'à un mot clé.

et s'il y a un 1000 dans une phrase, mais pas au début, qui ne devrait donc pas être significatif ?


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#13 Le 06/04/2017, à 15:50

MicP

Re : [Résolu] Bash - Fusionner ligne fichier texte jusqu'à un mot clé.

Je ne suis pas sûr d'avoir bien compris, mais j'ai testé avec ce texte en entrée,
dans lequel j'ai ajouté la dernière ligne :

michel@debg53sw:~$ cat fichierTexte 
1000 toto titi
tata
1000  toto
titi
tata
1000 toto
titi tata
tata titi 1000 toto tata
michel@debg53sw:~$ 
michel@debg53sw:~$ PasPremierMot=0; for mot in $(<fichierTexte); do [ $PasPremierMot = 1 ] && [ $mot = 1000 ] && printf '\n%s ' $mot || printf '%s ' $mot; PasPremierMot=1; done; printf '\n'
1000 toto titi tata 
1000 toto titi tata 
1000 toto titi tata tata titi 
1000 toto tata 
michel@debg53sw:~$ 

Mais j'ai peut-être mal compris,
si c'est le cas, pourrais-tu donner un exemple de texte en entrée et le texte résultant qui devrait être sortis.

Hors ligne

#14 Le 06/04/2017, à 16:30

Watael

Re : [Résolu] Bash - Fusionner ligne fichier texte jusqu'à un mot clé.

oui, c'est ça.
le dernier 1000 n'étant pas en début de ligne ne devrait pas provoquer d'alinéa.

mais c'est à Slyfox de préciser le fonctionnement du script.


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#15 Le 06/04/2017, à 16:35

MicP

Re : [Résolu] Bash - Fusionner ligne fichier texte jusqu'à un mot clé.

…c'est à Slyfox de préciser le fonctionnement du script.…

C'est vrai qu'avec une seule phrase courte, c'est difficile de ne pas se retrouver avec plusieurs interprétations possibles.
Et d'un autre côté, j'ai toujours plaisir à en apprendre un peu plus.

Hors ligne

#16 Le 06/04/2017, à 16:55

Hizoka

Re : [Résolu] Bash - Fusionner ligne fichier texte jusqu'à un mot clé.

Et merci de nous permettre de lire ça aussi smile


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne