加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

perl – 通过匹配列合并文件

发布时间:2020-12-15 21:16:45 所属栏目:大数据 来源:网络整理
导读:我有两个文件: 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 F
我有两个文件:
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*

但这就是我被困的地方……
不知道如何在greping之后我应该逐列组合文件&写NA缺少值的地方.

希望有人可以帮助我.

解决方法

由于我用bash 3.2运行为sh(没有进程替换为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,0 -a 1 -a 2 -e NA <(sort -k2b File1) <(sort -k2b File2)

如果您希望数据格式不同,请使用awk对输出进行后处理:

$join -1 2 -2 2 -o 1.1,0 -a 1 -a 2 -e NA f1.sort f2.sort |
> awk '{ printf "%-5s %-5s %sn",$1,$2,$3 }'
12    23    abc
34    NA    cde
11    8     df
42    12    dfg
9     NA    e
NA    24    gjr
$

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读