合并所有列匹配的文件2和文件1

2022-01-28 10:19:06 标签 linuxawkmerge

我有下面的sas代码,我想用bash或Python复制linux机器上的任何东西。

它基于匹配的列(amer_chrr 。chr=map。chr)将两个文件合并在一起(amer_chr和map),但保留两个文件中的行

proc sql;
  create table both_amer_chr. as 
    select amer_chr.* , map.* 
    from amer_chr,map 
    where amer_chr.chr=map.chr
  ;

Amer_chr看起来像

chr score weight
1 1 1235
1 2 1268
1 3 1258
2 1 1267
2 1 2467
3 1 1122
3 4 5634
39 3 1234

地图上看起来像

chr snp pos
1 1_123 1234
1 1_213 1456
1 1_435 1678
2 2_122 1763
2 2_321 1987
2 2_379 2003
3 3_013 2000
3 3_184 2008
3 3_398 4929
3 3_518 6512

sas中的结果both_amer_chr将如下所示,并且不会包括amer_chr的最后一行,因为它的chr=39不在文件2中

chr score weight chr snp pos
    1 1 1235 1 1_123 1234
    1 1 1235 11 1_213 1456
    1 1 1235 1 1_435 1678
    1 2 1268 1 1_123 1234
    1 2 1268 1 1_213 1456
    1 2 1268 1 1_435 1678
    1 3 1258 1 1_123 1234
    1 3 1258 1 1_213 1456
    1 3 1258 1 1_435 1678
    2 1 1267 2 2_122 1763
    2 1 1267 2 2_321 1987
    2 1 1267 2 2_379 2003
    2 1 2467 2 2_122 1763
    2 1 2467 2 2_321 1987
    2 1 2467 2 2_379 2003
    3 1 1122 3 3_013 2000
    3 1 1122 3 3_184 2008
    3 1 1122 3 3_398 4929
    3 1 1122 3 3_518 6512
    3 4 5634 3 3_013 2000
    3 4 5634 3 3_184 2008
    3 4 5634 3 3_398 4929
    3 4 5634 3 3_518 6512

本质上,将CHR列与文件1匹配的所有文件2连接起来。有没有一种方法来重新创建使用bash可能与awk或Python或perl?

# # #,join basically<基本上

=比;连接文件的第一列

join amer_chr map

或用于do not default列(-j)

join -j 1 amer_chr map

如果你想要两列chr

=比;添加格式选项(-o)以选择列的顺序

join -j 1 -o 0,1.2,1.3,2.1,2.2,2.3 amer_chr map

如果你想要amer_chr文件中的数据而不是map文件中的数据

=比;添加append (-a)选项和空文本(-e)选项

join -j 1 -o 0,1.2,1.3,2.1,2.2,2.3 -a 1 -e "none" amer_chr map

如果你想要的数据在文件映射而不是在amer_chr

=比;在第二个文件中添加append (-a)选项和空文本(-e)选项

join -j 1 -o 0,1.2,1.3,2.1,2.2,2.3 -a 2 -e "none" amer_chr map

如果你想要amer_chr文件中的数据而不是在map中,或者在file map中而不是在amer_chr中

=比;添加append (-a)选项两次和空文本(-e)选项

join -j 1 -o 0,1.2,1.3,2.1,2.2,2.3 -a 1 -a 2 -e "none" amer_chr map

###这可能是你试图做的(取决于你想如何处理一行inmap with a chr value that doesn't exist in Amer_chr) using any awk in与一个chr value t不存在的值Amer_chr) using any awk in any shell )在每个Unix机器的任何shell中使用任何awk,无论输入文件中的行顺序和输入文件中有多少字段:

$ cat tst.awk
NR==FNR {
    vals[$1,++cnt[$1]] = $0
    next
}
$1 in cnt {
    for (i=1; i<=cnt[$1]; i++) {
        print $0, vals[$1,i]
    }
}

$ awk -f tst.awk map Amer_chr
chr score weight chr snp pos
1 1 1235 1 1_123 1234
1 1 1235 1 1_213 1456
1 1 1235 1 1_435 1678
1 2 1268 1 1_123 1234
1 2 1268 1 1_213 1456
1 2 1268 1 1_435 1678
1 3 1258 1 1_123 1234
1 3 1258 1 1_213 1456
1 3 1258 1 1_435 1678
2 1 1267 2 2_122 1763
2 1 1267 2 2_321 1987
2 1 1267 2 2_379 2003
2 1 2467 2 2_122 1763
2 1 2467 2 2_321 1987
2 1 2467 2 2_379 2003
3 1 1122 3 3_013 2000
3 1 1122 3 3_184 2008
3 1 1122 3 3_398 4929
3 1 1122 3 3_518 6512
3 4 5634 3 3_013 2000
3 4 5634 3 3_184 2008
3 4 5634 3 3_398 4929
3 4 5634 3 3_518 6512
阅读全文

▼ 版权说明

相关文章也很精彩
推荐内容
更多标签
相关热门
全站排行
随便看看

错说 cuoshuo.com —— 程序员的报错记录

部分内容根据CC版权协议转载;网站内容仅供参考,生产环境使用务必查阅官方文档

辽ICP备19011660号-5

×

扫码关注公众号:职场神器
发送: 1
获取永久解锁本站全部文章的验证码