Bash join命令

AWE*_*AWE 10 unix linux bash join

Infile1:

1 a
3 c
4 d
6 f
Run Code Online (Sandbox Code Playgroud)

Infile2:

1 a 
2 b
5 e
6 f
7 g
8 h
Run Code Online (Sandbox Code Playgroud)

如何使用unix join命令连接这些文件以获取此输出:

1 aa
2 b
3 c
4 d
5 e
6 ff
7 g 
8 h
Run Code Online (Sandbox Code Playgroud)

Dogbanes回答有效,但......当我在这个文件上应用dogbanes回答时:

27  27
28  22
29  37
30  15
31  21
32  13
33  18
34  24
Run Code Online (Sandbox Code Playgroud)

还有这个:

27  7
28  13
29  6
30  12
31  30
32  5
33  10
34  28
Run Code Online (Sandbox Code Playgroud)

他们不加入:

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
Run Code Online (Sandbox Code Playgroud)

第二个场景是制表符分隔,所以我用过 -t \t

cho*_*oba 13

适合我(差不多).您应该-t $'\t'为制表符指定,而不仅仅是-t \t.\t除非在$''引号中,否则Bash不会解释.

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
Run Code Online (Sandbox Code Playgroud)


dog*_*ane 12

首先是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
Run Code Online (Sandbox Code Playgroud)


Ken*_*ent 5

这应该适用于您的两种情况:

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
Run Code Online (Sandbox Code Playgroud)

情况一的输出:

1 aa
2 b
3 c
4 d
5 e
6 ff
7 g
8 h
Run Code Online (Sandbox Code Playgroud)

情况二的输出:

27 277
28 2213
29 376
30 1512
31 2130
32 135
33 1810
34 2428
Run Code Online (Sandbox Code Playgroud)