Problème commande script shell JOIN

Résolu/Fermé
moi.néo Messages postés 1132 Date d'inscription vendredi 17 septembre 2004 Statut Membre Dernière intervention 9 juin 2011 - 3 déc. 2009 à 21:45
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 - 8 août 2013 à 10:22
Salut à tous.

J'ai un petit souci avec la commande join.
Quand je fais avec ces fichiers, ça fonctionne :

$>cat f1
1 56
2 45
3 23
4 50
5 12

$>cat f2
1 67
2 49
4 90
5 88

$>join -j 1 f1 f2
1 56 67
2 45 49
4 50 90
5 12 88


Mais quand je le fais avec celà, ça fonctionne plus :

$>cat f1
23 55.007399911
24 55.012110862
25 55.032641812
26 55.036972761
27 55.057383709
28 55.092211573
29 55.061694655
30 55.104722505

$>cat f2
3 10.000000000
5 13.000000000
8 19.000000000
12 31.000000000
23 55.000000000
24 55.007399911
25 55.012110862
26 55.032641812
27 55.036972761
28 55.036972761
29 55.057383709
30 55.061694655
31 55.092211573
32 55.104722505
33 55.109133448
34 55.121184403

$>join -j 1 f1 f2


Rien ne s'affiche :s

Avez-vous une idée ?
Merci d'avance.
A voir également:

8 réponses

dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
4 déc. 2009 à 07:55
autre variante
$ cat f1 f2 | awk '{x[$1]=x[$1] " " $2}; END {for(n in x)print n, x[n]}'|sort -n  
3  10.000000000
5  13.000000000
8  19.000000000
12  31.000000000
23  55.007399911 55.000000000
24  55.012110862 55.007399911
25  55.032641812 55.012110862
26  55.036972761 55.032641812
27  55.057383709 55.036972761
28  55.092211573 55.036972761
29  55.061694655 55.057383709
30  55.104722505 55.061694655
31  55.092211573
32  55.104722505
33  55.109133448
34  55.121184403
$
1
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
5 déc. 2009 à 13:11
voila:
pour chaque ligne lue par awk
y[$1]=length(x[$1]) on sauve dans un tableau y indexé par le champ 1 la longueur du même élément du tableau x, 0 si il est vide

x[$1]=x[$1] " " $2} dans un tableau x, on ajoute le champ 2 à ce que contient déja x, si il avait quelque chose

à la fin
END {for(n in x)if(y[n])print n, x[n]} on imprime chaque élément de x, si le contenu du même index de y n'est pas nul

$ cat f1 f2 | awk '{y[$1]=length(x[$1]) ;x[$1]=x[$1] " " $2}; END {for(n in x)if(y[n])print n, x[n]}'|sort -n
23  55.007399911 55.000000000
24  55.012110862 55.007399911
25  55.032641812 55.012110862
26  55.036972761 55.032641812
27  55.057383709 55.036972761
28  55.092211573 55.036972761
29  55.061694655 55.057383709
30  55.104722505 55.061694655
0
peux tu expliquer ton awk stp car il répond parfaitement à mon besoin mais impossible de le comprendre !
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
8 août 2013 à 09:49
Salut,

Les explications sont . Hormis le début (longueur), le reste est pareil.
0
Utilisateur anonyme
3 déc. 2009 à 22:59
J'observe que si f2 comence à 23, ça fonctionne


__
La blague c'est ~
Il y a 10 types de personnes : l'un qui connait le binaire, et l'autre...
0
moi.néo Messages postés 1132 Date d'inscription vendredi 17 septembre 2004 Statut Membre Dernière intervention 9 juin 2011 86
3 déc. 2009 à 23:33
Oui, j'ai remarqué ça aussi, alors j'avais essayé, juste après de créer les fichiers d'ajouter une première ligne commune (ex : "1 12").
Mais ça marche pas :s
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
4 déc. 2009 à 07:21
hello
le but c'est d'avoir ?
23 55.007399911 55.000000000
24 55.012110862 55.007399911
25 55.032641812 55.012110862
26 55.036972761 55.032641812
27 55.057383709 55.036972761
28 55.092211573 55.036972761
29 55.061694655 55.057383709
30 55.104722505 55.061694655
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
4 déc. 2009 à 07:40
Salut,

C'est un peu biscornu mais ça marche à condition que le 1er champ ne comporte que 2 caractères ;-\

sort -r f1 f2  | sort | uniq -w 2 -d | join f1 -

;-))
0
moi.néo Messages postés 1132 Date d'inscription vendredi 17 septembre 2004 Statut Membre Dernière intervention 9 juin 2011 86
4 déc. 2009 à 18:46
@jipicy : beau bricolage mais ça marche pas dans tous les cas :s
@dubcek : oui c'est bien ça sauf qu'il faut garder que les lignes à 3 champs, les autres servent plus.
Peut tu m'expliquer ton awk, je comprend pas ?

Merci à vous.
0
moi.néo Messages postés 1132 Date d'inscription vendredi 17 septembre 2004 Statut Membre Dernière intervention 9 juin 2011 86
4 déc. 2009 à 20:34
Bon, en fait j'ai compris, on doit trier les données par ordre lexicographique (et pas numérique) pour que JOIN fonctionne correctement ;)
@dubcek : je veux bien que tu m'expliques ton awk, même si le problème est résolu :)
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
8 août 2013 à 10:22
Salut,

Quelques années après....

$ join  -j 1 f1 <(sort -k 1b,1 f2)
23 55.007399911 55.000000000
24 55.012110862 55.007399911
25 55.032641812 55.012110862
26 55.036972761 55.032641812
27 55.057383709 55.036972761
28 55.092211573 55.036972761
29 55.061694655 55.057383709
30 55.104722505  55.061694655

;-))
0
moi.néo Messages postés 1132 Date d'inscription vendredi 17 septembre 2004 Statut Membre Dernière intervention 9 juin 2011 86
6 déc. 2009 à 09:42
Ok, merci pour l'explication ;)
0