2012-01-13 11 views
8

Infile1:Bash dołączyć polecenia

1 a 
3 c 
4 d 
6 f 

Infile2:

1 a 
2 b 
5 e 
6 f 
7 g 
8 h 

Jak mogę dołączyć do tych plików z UNIX polecenia dołączyć, aby uzyskać ten wynik:

1 aa 
2 b 
3 c 
4 d 
5 e 
6 ff 
7 g 
8 h 

Dogbanes odpowiedzieć obrobione ale ... kiedy stosuję dogbanes odpowiedź na ten plik:

27 27 
28 22 
29 37 
30 15 
31 21 
32 13 
33 18 
34 24 

a to:

27 7 
28 13 
29 6 
30 12 
31 30 
32 5 
33 10 
34 28 

Nie dołączyć:

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 

Drugi scenariusz jest zakładka ograniczona więc użyłem -t \t

Odpowiedz

11

Pierwszy sort oba pliki. Następnie użyj join, aby dołączyć do pierwszego pola obu plików. Musisz również potokować wyjście przez sed, jeśli chcesz usunąć przestrzeń i w ten sposób przekonwertować a a na aa. Zostało to pokazane poniżej:

$ 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 
11

Działa dla mnie (prawie). Należy podać -t $'\t' dla znaku tabulacji, a nie tylko -t \t. Bash nie interpretuje \t, chyba że w cytatach z $''.

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 
4

to powinno działać dla obu przypadkach:

awk 'NR==FNR{a[$1]=$2;next;} {a[$1]=($1 in a)?a[$1]$2:$2}END{for(x in a)print x,a[x]}' f1 f2|sort 

wyjście do jednego przypadku:

1 aa 
2 b 
3 c 
4 d 
5 e 
6 ff 
7 g 
8 h 

wyjście na razie dwa:

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

ładnie wykonane. Podobało mi się użycie 'potrójnego operatora' zamiast' if-else' +1 :) –

Powiązane problemy