10
votes

Commande Bash Rejoindre

infile1: xxx pré>

infile2: p> xxx pré>

Comment puis-je rejoindre ces fichiers avec la commande UNIX de jointure pour obtenir cette sortie:

27  27
27  7
28  13
28  22
29  37
29  6
30  12
30  15
31  21
31  30
32  13
32  5
33  10
33  18
34  24
34  28


0 commentaires

3 Réponses :


13
votes

premier Trier code> les deux fichiers. Ensuite, utilisez rejoindre code> pour rejoindre le premier champ des deux fichiers. Vous devez également piper la sortie via sed code> si vous souhaitez supprimer l'espace et convertir ainsi a aa code> dans aa code>. Ceci est indiqué ci-dessous:

$ join -t " " -1 1 -2 1 -a 1 -a 2  <(sort file1) <(sort file2) | sed 's/ \([a-z]\) / \1/g'
1 aa
2 b
3 c
4 d
5 e
6 ff
7 g
8 h


0 commentaires

14
votes

fonctionne pour moi (presque). Vous devez spécifier -t $ '\ t' code> pour le caractère de tabulation, pas seulement -t \ t code>. BASH n'interpré pas \ t code> sauf si dans $ '' '' '' '' '' '' code> citations.

join -t $'\t' -o 1.2,2.2 <(echo  $'27\t27
28\t22
29\t37
30\t15
31\t21
32\t13
33\t18
34\t24' | sort) <(echo $'27\t7
28\t13
29\t6
30\t12
31\t30
32\t5
33\t10
34\t28' | sort)
27      7
22      13
37      6
15      12
21      30
13      5
18      10
24      28


0 commentaires

4
votes

Ceci devrait fonctionner pour vos deux cas:

27 277
28 2213
29 376
30 1512
31 2130
32 135
33 1810
34 2428


1 commentaires

Bien fait. Aimé l'utilisation de opérateur ternaire au lieu de if-ele +1 :)