Perl bash通过匹配列合并文件

Perl bash通过匹配列合并文件,perl,bash,sed,awk,Perl,Bash,Sed,Awk,我有两个文件: File1 12 abc 34 cde 42 dfg 11 df 9 e File2 23 abc 24 gjr 12 dfg 8 df 我希望将文件按列合并(如果第2列相同),以获得如下输出: File1 File2 12 23 abc 42 12 dfg 11 8 df 34 NA cde 9

我有两个文件:

 File1

 12    abc
 34    cde
 42    dfg
 11    df
 9     e   


 File2

 23    abc
 24    gjr
 12    dfg
 8     df
我希望将文件按列合并(如果第2列相同),以获得如下输出:

  File1  File2
   12    23    abc
   42    12    dfg
   11    8     df
   34    NA    cde
   9     NA    e
   NA    24    gjr
 cat File* >> tmp; sort tmp | uniq -c | awk '{print $2}' > column2; for i in
 $(cat column2); do grep -w "$i" File*
我该怎么做

我这样试过:

  File1  File2
   12    23    abc
   42    12    dfg
   11    8     df
   34    NA    cde
   9     NA    e
   NA    24    gjr
 cat File* >> tmp; sort tmp | uniq -c | awk '{print $2}' > column2; for i in
 $(cat column2); do grep -w "$i" File*
但这就是我被困的地方…
不知道灰显后我应该如何逐列合并文件,并在缺少值的地方写入NA


希望有人能帮我

由于我使用运行为
sh
bash
3.2进行测试(它没有进程替换为
sh
),因此我使用了两个临时文件来准备数据,以便与
join
一起使用:

$ sort -k2b File2 > f2.sort
$ sort -k2b File1 > f1.sort
$ cat f1.sort
12    abc
34    cde
11    df
42    dfg
9     e  
$ cat f2.sort
23    abc
8     df
12    dfg
24    gjr
$ join -1 2 -2 2 -o 1.1,2.1,0 -a 1 -a 2 -e NA f1.sort f2.sort
12 23 abc
34 NA cde
11 8 df
42 12 dfg
9 NA e
NA 24 gjr
$
使用进程替换,您可以编写:

join -1 2 -2 2 -o 1.1,2.1,0 -a 1 -a 2 -e NA <(sort -k2b File1) <(sort -k2b File2)

您可以编写
排序文件*| uniq-c…
,而无需使用
cat
。它不会改变您得到的答案,但可以避免创建必须删除的中间文件。请检查此处:谢谢!工作完美。我能问一下“sort-k2b”中的“b”代表什么吗?当然,你可以看看手册……但这意味着在排序中忽略了前导空格。我第一次省略了
b
,join根本不生成数据。我以前遇到过这个问题;我只是踢了踢自己,又做了一次排序,而不是担心加入选项出了什么问题,在你做了几次之前,要想正确选择是很痛苦的。+1。说到连接选项,
-j2
相当于
-12-22
。另外,
列-t
可以替换awk命令。@glennjackman:
-j
选项不是的一部分,但是
-1
-2
选项是。OTOH,
-j
历史悠久(第7版)™ 使用它,而不是
-1
-2
),因此许多版本的
都支持它。在某些情况下,您可能需要编写
-j12-j23
来连接文件1的第2列和文件2的第3列;POSIX符号应该是
-12-23
。我以前没有像命令一样运行过
;它不在POSIX中,但在BSD(Mac OS X)和其他可能的地方都有。自从发布这篇文章后,我发现
bash
3.2确实有进程替换,但只有当它作为
bash
而不是
sh
运行时才有。我将它作为
sh
运行,因此它不支持符号。