设为首页 收藏本站
查看: 1937|回复: 0

[经验分享] awk、perl对多个文件取交集

[复制链接]

尚未签到

发表于 2015-12-26 16:29:24 | 显示全部楼层 |阅读模式
  我手头上有五个文件,他们的格式都是一样的,如果我想求他们的交集,并且如果1、2、3、6、7列都相同,则输出其文件名“\t"$0.我尝试用awk去做,可是结果并不齐全.应该怎么做呢?
1.505.txt
WINGS 1000 4000 3 3/18_707 2 3
ANNY 4000 7000 4 4/18_707 3 4
MOLLY 3000 4300 5 5/18_707 4 5
TINAG 8000 10000 6 6/18_707 5 6
2.707.txt
WINGS 1000 4000 3 3/20_505 2 3
WINGS 5000 6000 8 8/20_505 3 3
SANLY 2000 4000 9 9/20_505 2 2
TINAG 8000 10000 11 11/20_505 5 6
3.808.txt
WINGS 1000 4000 3 1/20_808 2 3
WINGS 5000 6000 5 5/20_808 3 3
ANNY 4000 7000 9 9/20_808 3 3
TINAG 8000 10000 4 4/20_808 5 6
4.909.txt
WINGS 1000 4000 3 3/20_909 2 3
MKEA 1000 6200 1 1/30_909 3 3
TNLY 2000 4000 9 9/20_909 2 2
TINAG 8000 10000 11 11/20_909 5 6
5.202.txt
WINGS 1000 4000 3 1/20_202 2 3
WINGS 5000 6000 5 5/20_202 3 3
ANNY 4000 7000 9 9/20_202 3 3
TINAG 8000 10000 4 4/20_202 5 6
__________________________________________________________________________________________
结果是:
505.txt WINGS 1000 4000 3 3/18_707 2 3
707.txt WINGS 1000 4000 3 3/20_505 2 3
808.txt WINGS 1000 4000 3 1/20_808 2 3
909.txt WINGS 1000 4000 3 3/20_909 2 3
202.txt WINGS 1000 4000 3 1/20_202 2 3
505.txt TINAG 8000 10000 6 6/18_707 5 6
707.txt TINAG 8000 10000 11 11/20_505 5 6
808.txt TINAG 8000 10000 4 4/20_808 5 6
909.txt TINAG 8000 10000 11 11/20_909 5 6
202.txt TINAG 8000 10000 4 4/20_202 5 6
——————————————————————————————————————————



awk -vD=',' '{if(F!=FILENAME)f++;F=FILENAME;n=$1D$2D$3D$6D$7;a[n]=a[n]F" "$0"\n";c[n]++}END{for(n in c)if(c[n]==f)printf("%s",a[n])}' 505.txt 707.txt 808.txt
---------------------------------------------------------------------------------------------


1 #!/usr/bin/perl
2 my @files = qw/505.txt 202.txt 707.txt 808.txt 909.txt/;
3 my ( $N, %A );
4
5 for my $C (@files) {
6     open my ($F), $C;
7     unless ( $N++ ) {
8         while (<$F>) {
9             my @B = (split)[ 0, 1, 2, 5, 6 ];
10             push @{ $A{"@B"}{$C} }, "$C $_";
11         }
12         next;
13     }
14
15     while (<$F>) {
16         my @B = (split)[ 0, 1, 2, 5, 6 ];
17         $A{"@B"} and push @{ $A{"@B"}{$C} }, "$C $_";
18     }
19     %A = map { $_, $A{$_} } grep keys %{ $A{$_} } == $N, keys %A;
20 }
21
22 for ( values %A ) {
23     keys %$_ == @files and print map @$_, values %$_;
24 }


1 另一个例子:
2 #!/bin/sh
3 #$ -S /bin/sh
4 dir="$1"
5 date_start=`date|awk -F"[ :]" '{print $4*3600 + $5*60 +$6}'`
6 for i in `ls  $dir/*_vcfanno.bed.gz`
7 do
8 p=`basename $i`
9 zcat $i|awk -F "\t" '{if($32!~/^utr$`/)print}' |awk -F "\t" '{if($32!~/ncRNA/)print}'|awk -F "\t" '{if($32!~/unknown/)print}'|awk -F "\t" '{if($32!~/abnormal/)print}'|a
10 done
11 awk -F "\t" '{print $1"@"$2"@"$3"@"$11"@"$13"@"$14}' *.bed.gz|awk '{n=$1$2$3;a[n]++==1;b[n]=$0;if(a[n]>11)print b[n]}'|sed 's/@/\t/g' > middle
12
13 for k in `ls  ./*_vcfanno.bed.gz`
14 do
15 awk 'NR==FNR{a[$1$2]=FILENAME"\t"$0;next}{if($1$2 in a)print a[$1$2];}' $k middle >>result_for_bed
16 done
17
18 #rm *_vcfanno.bed.gz
19 rm middle
20 date_end=`date|awk -F"[ :]" '{print $4*3600 + $5*60 +$6}'`
21 time=`expr "$date_end" - "$date_start"`
22 echo "This program have taken $time seconds"
23 ----------------------------------------------------------------------------


1 #!/usr/bin/perl -w
2 ##Usage:
3 ##perl $0 $dir > result.txt
4
5 my @files = glob "$ARGV[0]/*vcfanno.bed.gz";
6 my ( $N, %A );
7
8 for my $C (@files) {
9     open my ($F), $C;
10         unless ( $N++ ) {
11                 while (<$F>) {
12                             my @B = (split)[ 0, 1, 2, 10, 12, 13 ];
13                                         push @{ $A{"@B"}{$C} }, "$C $_";
14                                                 }
15                                                         next;
16                                                             }
17
18                                                                 while (<$F>) {
19                                                                         my @B = (split)[ 0, 1, 2, 10, 12, 13 ];
20                                                                                 $A{"@B"} and push @{ $A{"@B"}{$C} }, "$C $_";
21                                                                                     }
22                                                                                         %A = map { $_, $A{$_} } grep keys %{ $A{$_} } == $N, keys %A;
23                                                                                         }
24
25                                                                                         for ( values %A ) {
26                                                                                             keys %$_ == @files and print map @$_, values %$_;
27                                                                                             }
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-156702-1-1.html 上篇帖子: Perl file checking 下篇帖子: StringTemplate Perl 版
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表