Команда соединения Bash - PullRequest
       1

Команда соединения Bash

10 голосов
/ 13 января 2012

Infile1:

1 a
3 c
4 d
6 f

Infile2:

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

Как мне объединить эти файлы с помощью команды unix join, чтобы получить эти выходные данные:

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

Ответ собачьих баночек сработал, но ... когда я применяю собачьи баны, ответьте на этот файл:

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

и это:

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

Они не объединяются:

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

Второй сценарий с разделителями табуляции, поэтому я использовал -t \t

Ответы [ 3 ]

13 голосов
/ 13 января 2012

у меня работает (почти). Вы должны указать -t $'\t' для символа табуляции, а не только -t \t. Bash не интерпретирует \t, если не в $'' кавычках.

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
12 голосов
/ 13 января 2012

Первый sort оба файла.Затем используйте join, чтобы присоединиться к первому полю обоих файлов.Вам также нужно передать поток через sed, если вы хотите удалить пробел и таким образом преобразовать a a в aa.Это показано ниже:

$ 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
4 голосов
/ 13 января 2012

это должно работать в обоих случаях:

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

вывод для первого случая:

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

вывод для второго случая:

27 277
28 2213
29 376
30 1512
31 2130
32 135
33 1810
34 2428
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...