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 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 ?

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.

tiramiseb a écrit :

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,

tiramiseb a écrit :

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...

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.

tiramiseb a écrit :
#!/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
Postmortem a écrit :
#!/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

Le Goss a écrit :

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 big_smile

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