Terminal et combo texte

symbol

Membre actif
13 Octobre 2004
536
25
Bonjour,

La commande "cat" du terminal met bout a bout des fichiers, mais je souhaite réaliser un combo a partir de 2 fichiers texte. du coup "cat" me semble sans interet.

Voici 2 fichiers texte (contenant seulement 2 mots chacun, pour l'exemple).
En realité, ces fichiers contiendront plusieurs milliers de mots.


fichier#1
maison
arbre

fichier#2
rouge
bleu

resultat devra être dans un seul fichier texte
maisonrouge
arbrerouge
maisonbleu
arbrebleu

Le résultat est a sauvegarder dans un fichier texte (.txt)

Une idée dans la manière de réaliser ca ?

Merci
 
S'il n'y a pas de numéro de ligne dans tes fichiers :
Bloc de code:
$ cat -n fichier1 > fichier1_number
$ cat -n fichier2 > fichier2_number
$ join fichier1_number fichier2_number
1 maison rouge
2 arbre bleu
$ join fichier1_number fichier2_number | cut -d' ' -f 2,3 | sed 's/ //g'
maisonrouge
arbrebleu

Le cat -n ajoute le numéro de ligne ce qui permet à la fonction join de marcher.
 
J'essai de suite :)

Merci


MAJ :
ooopsssss

je me suis mal expliqué.
On reprends les memes fichiers (j'ajoute plus de mots pour que ca soit plus clair)

fichier#1.txt
--------------
maison
bateau
avion
voiture

fichier#2.txt
--------------
rouge
bleu
jaune
vert

je souhaite que ca donne :
maisonrouge
maisonbleu
maisonjaune
maisonvert
bateaurouge
bateaubleu
bateaujaune
bateauvert
avionrouge
avionbleu
avionjaune
avionvert
voiturerouge
voiturebleu
voiturejaune
voiturevert

actuellement avec tes lignes de commandes, ca donne
maisonrouge
bateaubleu
avionjaune
voiturevert
 
Dernière édition:
Bonjour, Symbol

Je te met un applescript qui fait le boulot.
Je suppose que ecatomb te fera l'équivalent en shell ;)

Bloc de code:
tell application "Finder"
    set fichier1 to choose file with prompt "Sélectionnez le fichier 1"
    set fichier2 to choose file with prompt "Sélectionnez le fichier 2"
   
   
    open for access fichier1
    read fichier1
    set lefichier1 to the result
    close access fichier1
    set nb1 to count paragraph of lefichier1
   
    open for access fichier2
    read fichier2
    set lefichier2 to the result
    close access fichier2
    set nb2 to count paragraph of lefichier2
    set lelog to open for access (path to desktop folder as text) & "lacompil.txt" as text with write permission
    repeat with i from 1 to nb2
        repeat with j from 1 to nb1
            write paragraph i of lefichier1 & paragraph j of lefichier2 & return to lelog starting at eof
        end repeat
    end repeat
    close access lelog
end tell

tell application "Finder"
    (display dialog ("waouou ... Ca y est c'est fait !") buttons {"Salut !"})
end tell
 
Remplace le @ par un caractère qui est absent de tes fichiers.
Bloc de code:
$ join -t"@" -12 -22 fichier1 fichier2 | sed 's/@//g'
maisonrouge
maisonbleu
maisonjaune
maisonvert
bateaurouge
bateaubleu
bateaujaune
bateauvert
avionrouge
avionbleu
avionjaune
avionvert
voiturerouge
voiturebleu
voiturejaune
voiturevert
 
Autre solution :
Bloc de code:
$ while IFS= read -r line
do
sed "s/^/$line/" fichier2
done < fichier1

Mais dans ce cas, si ton fichier1 a 100 lignes, ben le ficher2 sera lu 100 fois ... Pas top si tes fichiers sont gros.
 
@zeltron54
J'ai testé ton script.

Ca commence bien et fini moins bien :)

J'ai pris un fichier de 676 mots. J'ai essayé de faire un combo de lui-même (676*676 = 456976)

le script a créé le fichier lacompil.txt, écrit 347610 mots avant de ...planter

Capture-d-e-cran-2018-11-05-a-17-48-41.png
 
maintenant j'essai la version d'ecatomb.

Bloc de code:
cat -n fichier1 > fichier1_number
cat -n fichier2 > fichier2_number
join -t"@" -12 -22 fichier1 fichier2 | sed 's/@//g'

Les mots sont bien gérés, c'est rapide, mais ca me donne un fichier texte (j'ai ajouté > macombo.txt) pas très bien formaté.

Capture-d-e-cran-2018-11-05-a-20-05-00.png


Mes fichiers sont formatés :
Capture-d-e-cran-2018-11-05-a-20-07-16.png
 
Bonjour, symbol

C'est un problème de délai "event", Je l'ai résolu !
Mais c'est très long.
Après un test de la méthode de ecatomb :coucou: ... Sa manière est beaucoup beaucoup beaucoup plus rapide et fonctionne très bien, et je n'ai pas de problème de format texte.
Donc je te laisse résoudre ton problème avec lui :)
 
Dernière édition:
@ecatomb

J'ai refait la manip, j'ai toujours la même erreur

1 aa 1 aa
1 aa 2 ab
1 aa 3 ac
1 aa 4 ad
1 aa 5 ae
1 aa 6 af
1 aa 7 ag
1 aa 8 ah

voici un dossier ZIP avec tous mes fichiers :
- 2 fichiers texte contenant les mots (2lettres.txt et 2lettres2.txt)
- 2 fichiers texte après commande "cat -n 2lettres.txt > fichier1_number.txt" et "cat -n 2lettres2.txt > fichier2_number.txt"
- 1 fichier texte après commande "join -t"@" -12 -22 fichier1_number.txt fichier2_number.txt | sed 's/@//g' > macombo.txt"

https://workupload.com/file/h4tWsFER

Merci
 
Bonjour,
Je viens de lire tes fichiers...
Tout à l'air bon ! que voudrais -tu obtenir exactement ?

Edit : Ce sont les numéros qui te gènes ?
 
je comptais avoir les mots collés

ca donne :
1 aa 1 aa
1 aa 2 ab
1 aa 3 ac

J'aimerais
aaaa
aaab
aaac
etccc

je peux dans bbedit retirer les caracteres indesirables. Mais si le fichier texte fait 1 giga, comment veux tu que j'edite ce fichier ?
 
@ecatomb

sinon autre chose :

Dans le script du KENO que tu m'as fait, y'a une ligne qui extrait le N° du dernier tirage posté par la FDJ (sur le site de la FDJ).

Une mise a jour de la page html à la FDJ a été faites.

Depuis la ligne qui extrait le N° de tirage ne fonctionne plus.
Du coup le script reste en carafe, et ne se lance plus. Il se met en attente 10 minutes (600 sec) sans fin, pusque c'est ce N° qui permet de savori si un nouveau tirage est disponible.

Serait possible de mettre a jour cette ligne ?

Bloc de code:
############################################################################################
########################### TEST POUR SAVOIR SI NOUVEAU TIRAGE A LA FDJ ####################
## Si fichier NUMTIRAGE.txt n'existe pas,  alors création du fichier NUMTIRAGE.txt  avec N° du dernier tirage + lancement direct du script
## Si fichier NUMTIRAGE.txt existe, alors comparaison des N° de tirage (Si Nouveau tirage supérieur ->  sauvegarde du N° du dernier tirage dans NUMTIRAGE.txt  + lancement script)
############################################################################################
############################################################################################
repertoire="/Users/xxx/Desktop/KENODATA"

function download_keno () {
  ## créé le fichier keno.html avec la page actuelle du site, sinon on garde l'ancienne
  curl -s 'https://www.fdj.fr/jeux/jeux-de-tirage/keno/resultats' -o "${repertoire}"/keno_tmp -D "${repertoire}"/keno_code_retour
  ## Gestion des erreurs 404 et autres ...
  code_http=$(head -1 "${repertoire}"/keno_code_retour | cut -d " " -f2)
  ## https://fr.wikipedia.org/wiki/Liste_des_codes_HTTP
  if [ "${code_http}" == "200" ]
  then
    iconv -f 'iso-8859-15' -t 'UTF-8' "${repertoire}"/keno_tmp > "${repertoire}"/keno.html
    rm -f "${repertoire}"/keno_code_retour "${repertoire}"/keno_tmp
  fi
}

function attente_nouveau_tirage () {
  tirage_keno=$(grep "listDayTirage" "${repertoire}"/keno.html | cut -d'"' -f2)
  if [ -f "${repertoire}"/NUMTIRAGE.txt ]
  then
    echo le fichier existe
    tirage_fichier=$(cat "${repertoire}"/NUMTIRAGE.txt)

    ## tant que nouveau tirage identique/inférieur à celui du fichier
    while [ ${tirage_keno} -le ${tirage_fichier} ]
    do
      echo Pause de 10min
      sleep 600

      download_keno
      tirage_keno=$(grep "listDayTirage" "${repertoire}"/keno.html | cut -d'"' -f2)
    done
  fi

  ## créé le fichier NUMTIRAGE.txt avec le N° du dernier tirage
  echo ${tirage_keno} >  "${repertoire}"/NUMTIRAGE.txt
}

download_keno
attente_nouveau_tirage

## Extraction du résultat à partir de "${repertoire}"/keno.html
echo Extraction du résultat

Merci.
 
Dernière édition:
Alors en combinant le script de ecatomb et le mien, essai le script ci-dessous, et dis -moi si cela te conviens ?
A modifier l'adresse du fichier de sorti bien sur !

Bloc de code:
tell application "Finder"
    set fichier1 to choose file with prompt "Sélectionnez le fichier 1"
    set fichier2 to choose file with prompt "Sélectionnez le fichier 2"
   
    set fichier1 to quoted form of POSIX path of fichier1 as string
    set fichier2 to quoted form of POSIX path of fichier2 as string
   
    set lacommande to "join -t" & "@" & " -12 -22 " & fichier1 & " " & fichier2 & " | sed 's/@//g' > /Users/XXXX/Desktop/macombo.txt"
    do shell script lacommande
   
end tell

tell application "Finder"
    (display dialog ("waouou ... Ca y est c'est fait !") buttons {"Salut !"})
end tell
 
La commande fonctionne très bien avec les fichiers 2lettres :D
Bloc de code:
join -t"@" -12 -22 2lettres.txt 2lettres2.txt | sed 's/@//g' > macombo.txt