#1 Le 07/02/2014, à 00:41
- Le Goss
[Résolu] bash combinaisons et déplacements de lignes
Bonjour à tous,
Soit un premier fichier contenant
bla
bli
blo
et un deuxième
zap
zip
zop
Question 1: comment générer et exporter dans un autre fichier toutes les combinaisons possibles et avoir, avec une espace entre chaque mot:
bla zap
bla zip
bla zop
bli zap
bli zip
bli zop
blo zap
blo zip
blo zop
Je sais supprimer et insérer des lignes dans un fichier, mais je sèche pour ce qui suit:
Question 2: comment déplacer, dans un même fichier, une ligne 8 à la suite de la 3 (avec une espace intercalée)
Question 3: comment déplacer, dans un même fichier, une ligne 8 entre la 2 et la 3
Question 4: comment déplacer, dans un même fichier, une ligne 8 à la place de la 3
Merci pour votre aide !
Cordialement
Dernière modification par Le Goss (Le 12/02/2014, à 16:48)
Si je pose une question sur le forum, ce n'est pas par paresse ou pour faire faire "mes devoirs"; c'est par ignorance: j'ai 51 berges. Et, par principe, je préfère être traité d'ignare que de fainéant.
Samsung i7-3630QM CPU @ 2.40GHz × 8 - 64 bits - RAM 7,7 Gio - DD 976 Go - Bodhi 6.0.0 Ubuntu 20.04
Allergique au wysiwyg; traitement à vie: Lilypond - LaTeX - txt2tags
Hors ligne
#2 Le 07/02/2014, à 01:52
- Postmortem
Re : [Résolu] bash combinaisons et déplacements de lignes
Salut,
Pour la question 1 :
#!/bin/bash
while read line
do
B[i++]=$line
done < ficB
while read line
do
printf "$line %s\n" "${B[@]}"
done < ficA
Édit :
Pour la question 2 (j'ai pas testé) :
awk 'NR<3 || NR>8 {print;next}
{ligne[NR]=$0}
NR==8 { print ligne[3],ligne[8]; for(i=4;i<8;i++)print ligne[i]}' fichier
Dernière modification par Postmortem (Le 07/02/2014, à 02:13)
Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »
Hors ligne
#3 Le 07/02/2014, à 07:18
- pingouinux
Re : [Résolu] bash combinaisons et déplacements de lignes
Bonjour,
Pour les questions 3 et 4, on peut adapter facilement ce qu'a fait Postmortem pour la 2.
Ou alors avec sed :
Question 3
sed -n '3{h;b};4,7{H;b};p;8{g;p}' fichier
Question 4
sed -n '3d;4{h;b};5,7{H;b};p;8{g;p}' fichier
Ajouté : Pour la Question 2, c'est aussi possible avec sed, mais je n'ai pas trouvé plus simple
sed -rn '3{h;b};4,7{H;b};8{G;s/^([^\n]*\n)([^\n]*)\n(.*)$/\2 \1\3/p;b};p' fichier
Dernière modification par pingouinux (Le 07/02/2014, à 11:15)
Hors ligne
#4 Le 07/02/2014, à 13:39
- Postmortem
Re : [Résolu] bash combinaisons et déplacements de lignes
Pour la question 2, tout en bash :
i=0
unset tab_ligne
while read ligne
do
((i++))
(( i<3 || i>8 )) && { echo "$ligne"; continue;}
tab_ligne[i]=$ligne
(( i==8 )) && { printf '%s %s\n' "${tab_ligne[3]}" "${tab_ligne[8]}"
unset 'tab_ligne[3]' 'tab_ligne[8]'
printf '%s\n' "${tab_ligne[@]}"
}
done < fichier
Dernière modification par Postmortem (Le 07/02/2014, à 13:39)
Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »
Hors ligne
#5 Le 07/02/2014, à 14:53
- pingouinux
Re : [Résolu] bash combinaisons et déplacements de lignes
Allez, pour faire bonne mesure, une petite version en python pour la Question 2 :
#!/usr/bin/python
with open('fichier') as f :
ligs=f.readlines()
qui=8
ou=3
print(''.join(ligs[:ou-1])),
print("%s %s"%(ligs[ou-1][:-1],ligs[qui-1])),
print(''.join(ligs[ou:qui-1])),
print(''.join(ligs[qui:])),
Hors ligne
#6 Le 08/02/2014, à 13:52
- tiramiseb
Re : [Résolu] bash combinaisons et déplacements de lignes
Salut,
Un peu plus simple pour la question 1 :
#!/bin/bash
while read lineA
do
while read lineB
print "$lineA $lineB"
done < ficB
done < ficA
Cela étant dit, tout ça ça ressemble à des exercices (de cours ou de sites d'apprentissage).
Tu veux qu'on fasse tes exercices, c'est ça ?
Sébastien Maccagnoni - https://www.maccagnoni.eu - https://www.domotego.com
Hors ligne
#7 Le 08/02/2014, à 15:32
- Le Goss
Re : [Résolu] bash combinaisons et déplacements de lignes
Pas pu vous répondre avant, je découvre vos messages à l'instant.
Cela étant dit, tout ça ça ressemble à des exercices (de cours ou de sites d'apprentissage).
Tu veux qu'on fasse tes exercices, c'est ça ?
Tu te goures complètement... à l'âge que j'ai, mes études sont bien loin derrière moi. Ouais.
En plus je me suis mis à l'informatique sur le tard. Donc...
Que je vous explique ce que je veux faire, en espérant que je ne serai pas trop confus.
Bon. J'ai migré il y a quelques années de Windows à Linux.
J’utilisais alors le programme Band In A Box. Or les dernières versions ne fonctionne pas sous Linux.
J'ai essayé de faire tourner MMA, mais c'était vraiment laborieux. J'ai jeté l'éponge
J'ai souvent besoin de faire des séquences MIDI pour tout ce qui est guitare.
En furetant, je suis tombé sur cette page, et, après avoir regardé d'un peu plus près, je me suis dit que c'est pil poil ce qu'il me faut.
Sauf que pour rendre le truc agréable et rapide à utiliser, il faut faire un fichier répertoriant "tous" les accords guitare, et un autre répertoriant "tous" les styles (les parties entre [...])
Pour ces 2 parties, c'est OK.
Un morceau de musique est caractérisé par un grille d'accord et un ou plusieurs style préalablement définis.
Le but du script sur lequel je me casse les dents est notamment de rapprocher, une seule fois, sous forme de données utilisées utilisées par le programme, tous les styles et tous les accords choisis pour telle séquence.
D'ou mon besoin d'aide pour toutes les combinaisons possibles.
Les déplacements de lignes sont rendus nécessaires par la manière (peut-être pas la meilleure) dont le script et conçu...
Mais, après réflexion, je n'ai pas trouvé mieux.
Tant qu'on y est voilà comment ça se présente
Soit 2 style:
44ter81 [D-UD-UD-UD-U]
(44ter81 signifie mesure en 4/4 ternaire et croche pour durée la plus courte); style n°1 du type 44ter8 (c'est moi qui crée le 44ter8 etc.)
44bin162 [DUDU-UDUDUDU-UDU]
(44bin162 signifie mesure en 4/4 binaire et bouble-croche pour durée la plus courte); style n°2 du type 44bin16
Soit un 2 accords
C2 0 do3 sol3 do4 mi4 sol4
(Accord de Do Majeur 2ere position, 1ere corde muette et les 5 suivantes dans leurs positions respectives)
D1 0 0 re3 la3 re4 fa#4
(Accord de Ré Majeur 1ere position, 1ere et 2è cordes muette et les 4 suivantes dans leurs positions respectives)
Si on rapproche le 1er style et le 2e accord, on doit obtenir:
:C1.1 ch1 dt 64 A = 50h 10h B = 50h dt 2 10h C = 50h dt 4 10h D = 50h dt 6 10h E = 50h dt 8 10h F = 50h dt 10 10h G = 40h 05h H = 40h dt 2 05h I = 40h dt 4 05h J = 40h dt 6 05h K = 40h dt 8 05h L = 40h dt 10 05h
fa#4 [A-LA-LA-LA-L]
re4 [B-KB-KB-KB-K]
la3 [C-JC-JC-JC-J]
re3 [D-ID-ID-ID-I]
/*la2 [E-HE-HE-HE-H]*/
/*mi2 [F-GF-GF-GF-G]*/
;
Explications
:C1.1 variable accord de Do majeur 1ere position sytle 1
dt 64 A = 50h 10h... données hexadécimales des différentes données MIDI (J'ai pas tout pigé mais après quelques tests, j'ai trouvé les bons réglages)
La guitare se joue en frottant les cordes en montant ou en descendant. Donc
A, B, C, D, F, G représente le mouvement descendant
G, H, I, J, K, L le mouvement ascendant
; fin de la variable
Voilà pour les détails
Je testerai vos propositions en fin d'après-midi et je vous tiens au jus.
Merci pour vos suggestions et pour votre aide !
Dernière modification par Le Goss (Le 08/02/2014, à 15:34)
Si je pose une question sur le forum, ce n'est pas par paresse ou pour faire faire "mes devoirs"; c'est par ignorance: j'ai 51 berges. Et, par principe, je préfère être traité d'ignare que de fainéant.
Samsung i7-3630QM CPU @ 2.40GHz × 8 - 64 bits - RAM 7,7 Gio - DD 976 Go - Bodhi 6.0.0 Ubuntu 20.04
Allergique au wysiwyg; traitement à vie: Lilypond - LaTeX - txt2tags
Hors ligne
#8 Le 08/02/2014, à 16:15
- Postmortem
Re : [Résolu] bash combinaisons et déplacements de lignes
Salut,
Salut,
Un peu plus simple pour la question 1 :
#!/bin/bash while read lineA do while read lineB print "$lineA $lineB" done < ficB done < ficA
[mode je chipotte]Plus simple mais tu parcours autant de fois le fichier B qui il y a de lignes dans le A. C'est pour ça que j'ai séparé les 2 boucles.[/mode je chipotte]
Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »
Hors ligne
#9 Le 08/02/2014, à 18:01
- tiramiseb
Re : [Résolu] bash combinaisons et déplacements de lignes
Je ne m'y connais pas en guitare, mais concernant l'écriture de musique je ne peux que te conseiller Lilypond !
http://lilypond.org/
Voir notamment ça pour les guitares et autres instruments à cordes frettées :
http://lilypond.org/doc/v2.16/Documenta … nstruments
Lilypond permet bien sûr d'exporter en fichier MIDI...
http://lilypond.org/doc/v2.16/Documenta … idi-output
Après, je ne sais pas si ça peut venir en complément de ton affaire (à la place de textToMidi par exemple) ou si ça peut te simplifier la vie...
Sébastien Maccagnoni - https://www.maccagnoni.eu - https://www.domotego.com
Hors ligne
#10 Le 08/02/2014, à 19:34
- Le Goss
Re : [Résolu] bash combinaisons et déplacements de lignes
Pour mon plus grand plaisir, j'utilise régulièrement Lilypond depuis plusieurs années, mais il ne répond malheureusement pas à ce besoin.
#!/bin/bash while read lineA do while read lineB print "$lineA $lineB" done < accords2 done < patterns2
Message d'erreur:
test: ligne 6: Erreur de syntaxe près du symbole inattendu « done »
test: ligne 6: ` done < accords2'
Je crois qu'il manque un "do" et un"f" après print (voir le proposition de Postmortem); ajout d'une sortie. Fait à l'intuition, mais ça fonctionne:
#!/bin/bash
while read lineA
do
while read lineB
do
printf "$lineA $lineB"
done < accords2
done < patterns2
#!/bin/bash while read line do B[i++]=$line done < ficB while read line do printf "$line %s\n" "${B[@]}" done < ficA
En ajoutant une sortie vers fichier, ça fonctionne aussi.
Au fait, il sert à quoi le "f" de print?. Uniquement pour tiramiseb, j'ai remarqué que remplacer printf par echo produisait le même résultat.
Première fois que je la rencontre.
Si je pose une question sur le forum, ce n'est pas par paresse ou pour faire faire "mes devoirs"; c'est par ignorance: j'ai 51 berges. Et, par principe, je préfère être traité d'ignare que de fainéant.
Samsung i7-3630QM CPU @ 2.40GHz × 8 - 64 bits - RAM 7,7 Gio - DD 976 Go - Bodhi 6.0.0 Ubuntu 20.04
Allergique au wysiwyg; traitement à vie: Lilypond - LaTeX - txt2tags
Hors ligne
#11 Le 09/02/2014, à 01:41
- Le Goss
Re : [Résolu] bash combinaisons et déplacements de lignes
Ci-joint le code en question:
#!/bin/bash
resize -s 50 75
clear
echo -e "Création d'une nouvelle séquence MIDI..."
echo -e ""
read -p "Nom du fichier (ex: fichier.txt) : " nomfichier
read -p "Titre de la séquence (ex: Mon Titre ) : " titresequence
read -p "
Séquence binaire à la croche : 96
Séquence ternaire à la croche : 64
Séquence binaire à la double croche : 48
Séquence ternaire à la double croche : 32
Choix : " quant
read -p "Choisir un pattern ? (1/0) :" pattern
until [ "$pattern" = 0 ]; do
clear
echo -e "Patterns existants : "
echo -e ""
cat -n patterns
echo -e ""
read -p "Numéro de Ligne : " ligne
sed -n -e "$ligne p" patterns >> patternschoisis
echo -e ""
echo -e "Patterns déjà choisis : "
echo -e ""
sort -o patternschoisis2 patternschoisis
rm patternschoisis
cp patternschoisis2 patternschoisis
rm patternschoisis2
cat -n patternschoisis
echo -e ""
read -p "Choix d'un autre pattern ? (1/0) :" pattern
done
read -p "Choisir un accord ? (1/0) :" accord
until [ "$accord" = 0 ]; do
clear
echo -e "Accords existants : "
echo -e ""
cat -n accords
echo -e ""
read -p "Numéro de Ligne : " ligne
sed -n -e "$ligne p" accords >> accordschoisis
echo -e ""
sort -o accordschoisis2 accordschoisis
rm accordschoisis
cp accordschoisis2 accordschoisis
rm accordschoisis2
cat -n accordschoisis
echo -e ""
read -p "Choix d'un autre accord ? (1/0) :" accord
done
sed '/./=' patternschoisis | sed '/./N;s/\n/ /' >> patternschoisis2
while read lineA
do
while read lineB
do
printf "$lineA $lineB\n" >> combinaisons
done < patternschoisis2
done < accordschoisis
awk '{ print ":"$1"_"$8, $2, $3, $4, $5, $6, $7, $10 }' combinaisons >> combinaisons2
awk '{ print $1"_"$8 }' combinaisons >> listedescouples
sed -i ":z;N;s/\n/ /;bz" listedescouples
while read line
do
printf "$line" > ligneparligne
sed -i 's/ /\n/g' ligneparligne
sed -i '8{p;p;p;p;p}' ligneparligne
sed -i '8y/DU/AL/' ligneparligne
sed -i '9y/DU/BK/' ligneparligne
sed -i '10y/DU/CJ/' ligneparligne
sed -i '11y/U/I/' ligneparligne
sed -i '12y/DU/EH/' ligneparligne
sed -i '13y/DU/FG/' ligneparligne
sed -rn -i '7{h;b};8,12{H;b};13{G;s/^([^\n]*\n)([^\n]*)\n(.*)$/\2 \1\3/p;b};p' ligneparligne
sed -rn -i '6{h;b};7,11{H;b};12{G;s/^([^\n]*\n)([^\n]*)\n(.*)$/\2 \1\3/p;b};p' ligneparligne
sed -rn -i '5{h;b};6,10{H;b};11{G;s/^([^\n]*\n)([^\n]*)\n(.*)$/\2 \1\3/p;b};p' ligneparligne
sed -rn -i '4{h;b};5,9{H;b};10{G;s/^([^\n]*\n)([^\n]*)\n(.*)$/\2 \1\3/p;b};p' ligneparligne
sed -rn -i '3{h;b};4,8{H;b};9{G;s/^([^\n]*\n)([^\n]*)\n(.*)$/\2 \1\3/p;b};p' ligneparligne
sed -rn -i '2{h;b};3,7{H;b};8{G;s/^([^\n]*\n)([^\n]*)\n(.*)$/\2 \1\3/p;b};p' ligneparligne
sed -i '/^0/d' ligneparligne
echo -e ";\n/*=========================================================================*/\n" >> ligneparligne
sed -i 2i"ch1 dt $quant A = 50h 10h B = 50h dt 2 10h C = 50h dt 4 10h D = 50h dt 6 10h E = 50h dt 8 10h F = 50h dt 10 10h G = 40h 05h H = 40h dt 2 05h I = 40h dt 4 05h J = 40h dt 6 05h K = 40h dt 8 05h L = 40h dt 10 05h \n" ligneparligne
cat ligneparligne >> couples
done < combinaisons2
echo -e "/* Séquence : $nomfichier */
/*=========================================================================*/
" >> $nomfichier
cat couples >> $nomfichier
echo -e "
/***************************************************************************/
/* */
/* midi header */
/* */
/***************************************************************************/
MThd 00h 00h 00h 01h 00h 60h
/***************************************************************************/
/* */
/* midi track */
/* */
/***************************************************************************/
MTrk
dt 0 /* meta: sequence/track name */ FFh 03h \"$titresequence\"
dt 0 /* meta: copyright notice */ FFh 02h \"\" /*copyright de la séquence*/
dt 0 /* meta: SET-TEMPO */ FFh 51h #(05h A1h 00h)
/*** guitare ***/
dt 0 ch1 raz
dt 0 ch1 bank 0
dt 0 ch1 prgch 26
dt 0 ch1 vol 90
dt 0 ch1 pan 0
dt 0 ch1 reverb 40
dt 0 ch1 chorus 40
/*** debut ***/
dt 0 FFh 58h #(04h 02h 18h 08h) /* meta: TIME-SIGNATURE */
/*
Liste des couples accords-patterns :
" >> $nomfichier
cat listedescouples >> $nomfichier
echo -e "
*/
:guitare ... ; /*remplacer les pointillés par les couples; ex: C1_1*/
{
guitare
}
dt 361 FFh 2Fh #() /* meta: END-OF-TRACK */
" >> $nomfichier
rm patternschoisis
rm accordschoisis
rm listedescouples
rm couples
rm combinaisons
rm combinaisons2
rm ligneparligne
rm patternschoisis2
clear
read -p "Appuyez sur <entrée> pour ouvrir la séquences $nomfichier : "
gedit $nomfichier
exit 0
Si vous pouviez y jeter un œil... Il doit probablement y avoir des trucs tordus; mais ça fonctionne au poil y compris la génération de la séquence MIDI
Vous aurez besoin de créer 2 fichiers dans le même dossier que le script; un fichier "accords" avec un contenu du type
C1 0 do3 mi3 sol3 do4 mi4
C2 0 do3 sol3 do4 mi4 sol4
D1 0 0 re3 la3 re4 fa#4
et un fichier "patterns" du type
24bin161 [DUDU-UDU]
24ter81 [D-UD-U]
44bin11 [D]
44bin161 [DUDU-UDUDUDU-UDU]
44bin41 [D---U---D---U---]
44bin81 [DUDUDU-U]
44ter81 [D-UD-UD-UD-U]
44ter82 [D-UD-U--UD-U]
Merci pour les retours et pour m'avoir dépatouillé !
Cordialement
Si je pose une question sur le forum, ce n'est pas par paresse ou pour faire faire "mes devoirs"; c'est par ignorance: j'ai 51 berges. Et, par principe, je préfère être traité d'ignare que de fainéant.
Samsung i7-3630QM CPU @ 2.40GHz × 8 - 64 bits - RAM 7,7 Gio - DD 976 Go - Bodhi 6.0.0 Ubuntu 20.04
Allergique au wysiwyg; traitement à vie: Lilypond - LaTeX - txt2tags
Hors ligne
#12 Le 09/02/2014, à 10:45
- Postmortem
Re : [Résolu] bash combinaisons et déplacements de lignes
Salut,
Une des différence entre print et printf, c'est que le premier met systématiquement le retour à la ligne alors que le deuxième ne le met pas (c'est pourquoi il faut renseigner explicitement le \n).
Autrement, print affiche tel quel ses arguments alors qu'avec printf, on peut jouer sur les formats ; par exemple :
$ printf '%04d\n' 2
0002
Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »
Hors ligne
#13 Le 09/02/2014, à 11:28
- Watael
Re : [Résolu] bash combinaisons et déplacements de lignes
salut,
print est une commande KSH
printf est une commande POSIX, dont le f "signifie" format. Elle sert effectivement à dissocier le format d'affichage des données à afficher.
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#14 Le 09/02/2014, à 23:21
- tiramiseb
Re : [Résolu] bash combinaisons et déplacements de lignes
Je crois qu'il manque un "do" et un "f" après print
Oups désolé, j'ai oublié le "do" oui, et je voulais mettre "echo". Je mélange les langages
Sébastien Maccagnoni - https://www.maccagnoni.eu - https://www.domotego.com
Hors ligne
#15 Le 12/02/2014, à 16:48
- Le Goss
Re : [Résolu] bash combinaisons et déplacements de lignes
Merci à tous pour votre aide !
Sujet résolu !
Si je pose une question sur le forum, ce n'est pas par paresse ou pour faire faire "mes devoirs"; c'est par ignorance: j'ai 51 berges. Et, par principe, je préfère être traité d'ignare que de fainéant.
Samsung i7-3630QM CPU @ 2.40GHz × 8 - 64 bits - RAM 7,7 Gio - DD 976 Go - Bodhi 6.0.0 Ubuntu 20.04
Allergique au wysiwyg; traitement à vie: Lilypond - LaTeX - txt2tags
Hors ligne