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)
这应该适用于您的两种情况:
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)