搜索
查看: 5499|回复: 15

【Panda姐-perl练习题6】统计两个文件的共有及特有内容

[复制链接]

58

主题

103

帖子

756

积分

版主

Rank: 7Rank: 7Rank: 7

积分
756
QQ
发表于 2016-8-28 15:30:35 | 显示全部楼层 |阅读模式
本帖最后由 Panda姐 于 2016-8-30 19:06 编辑

题目:
现有2文件 A 和 B ,写一个脚本比较这两个文件,将 A 中特有的行输出到文件 onlyA.txt,B中特有的行输出到 onlyB.txt,共同有的内容输出到 bothAB.txt。
onlyA.txt 文件 将会有 129 列
onlyB.txt 文件 将会有 6 列
bothAB.txt 文件 将会有 44 列

shell解决脚本:
[Bash shell] 纯文本查看 复制代码
grep -F -f  A B | tee both.txt | wc -l
grep -F -f A -v  B |tee onlyB.txt |wc -l
grep -F -f B -v A | tee onlyA.txt |wc -l

解题思路:
将A作为第一个循环并作标记,B作为第二个循环。当A中元素等于B中元素时,输出到Both文件中,同时标记进行修改。退出B循环后,如果标签未改变,则表明A中的元素没有在B中找到相同的,则表明是A特有的。同理,颠倒A、B文件循环,找出B文件特有的。
代码记录:
[Perl] 纯文本查看 复制代码
# usr/bin/perl
use strict;
open AIN,"A";
open BIN,"B";
open BOTH,">both.txt";
open ONLYA,">onlyA.txt";
open ONLYB,">onlyB.txt";
my($a,$b,@a,@b,$t1,$t2);
chomp(@a=<AIN>);
chomp(@b=<BIN>);
foreach $a(@a){
   $t1=0;
   foreach $b(@b){
      if($a eq $b){
         print  BOTH "$a\n";
         $t1=1;
        }
       }
   if($t1==0){
   print  ONLYA "$a\n";
   }
}
foreach $b(@b){
 $t2=0;
   foreach $a(@a){
      if($b eq $a){
      $t2=1;
      }
    }
    if($t2==0){
    print  ONLYB "$b\n";
    }
}


A、B文件见以下压缩包:

小记:
继续思考此题,希望能精简代码。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x



上一篇:【Panda姐-perl练习题5】将fasta文件中的序列一行转为多行
下一篇:【Panda姐-perl练习题7】不同文件内的数据进行批量运算
回复

使用道具 举报

2

主题

8

帖子

141

积分

注册会员

Rank: 2

积分
141
发表于 2017-4-11 11:44:51 | 显示全部楼层
panda姐,我现在运行遇到问题,假设我a文件是:
DHS1
DHS2
DHS3
DHS4
DHS5
DHS6
DHS7
DHS8
DHS10
DHS12
b文件是:
DHS2
DHS3
DHS4
DHS5
DHS6
DHS7
DHS8
DHS11
DHS13
当我运行:grep -F -f b -v a |tee onlya |wc -l 时能得到结果3,但是当我运行:grep -F -f b -v a |tee onlya |wc -l 时得到的结果确实0。?????????????????????
回复 支持 1 反对 0

使用道具 举报

0

主题

14

帖子

227

积分

中级会员

Rank: 3Rank: 3

积分
227
发表于 2016-9-26 09:37:05 | 显示全部楼层
[Python] 纯文本查看 复制代码
# coding=utf-8
import os

os.chdir('C:/workspace/6')

file_A = open('A')
file_B = open('B')
only_A = open('only_A.txt','w+')
only_B = open('only_B.txt','w+')
both_AB = open('both_AB.txt','w+')
read_A = file_A.readlines()
read_B = file_B.readlines()

for a in read_A:
    if a in read_B:
        both_AB.write(a)
    else:
        only_A.write(a)

for b in read_B:
    if b not in read_A:
        only_B.write(b)


file_A.close()
file_B.close()
only_A.close()
only_B.close()
both_AB.close()
回复 支持 反对

使用道具 举报

11

主题

54

帖子

242

积分

中级会员

Rank: 3Rank: 3

积分
242
QQ
发表于 2016-10-10 19:25:11 | 显示全部楼层
设$t标签是不是多余了,如果不相等,就把$a输入到A独有,  $b输入到B独有????
苛求远离完美
回复 支持 反对

使用道具 举报

58

主题

103

帖子

756

积分

版主

Rank: 7Rank: 7Rank: 7

积分
756
QQ
 楼主| 发表于 2016-10-12 11:02:24 | 显示全部楼层
惠真-市二医院 发表于 2016-10-10 19:25
设$t标签是不是多余了,如果不相等,就把$a输入到A独有,  $b输入到B独有???? ...

我的代码并不是最优答案,如果你尝试成功了,把新的代码分享一下
回复 支持 反对

使用道具 举报

11

主题

54

帖子

242

积分

中级会员

Rank: 3Rank: 3

积分
242
QQ
发表于 2016-10-12 20:07:23 | 显示全部楼层
Panda姐 发表于 2016-10-12 11:02
我的代码并不是最优答案,如果你尝试成功了,把新的代码分享一下

别了,我写的很复杂,完全在练手的写代码,舍近求远呢!
苛求远离完美
回复 支持 反对

使用道具 举报

2

主题

8

帖子

141

积分

注册会员

Rank: 2

积分
141
发表于 2017-4-11 11:46:52 | 显示全部楼层
错了,当我运行grep -F -f a -v b |tee onlya |wc -l时得到的结果是0,也就是我得不到我想要的只在b中存在的DHS11和DHS13。好奇怪啊
回复 支持 反对

使用道具 举报

2

主题

8

帖子

141

积分

注册会员

Rank: 2

积分
141
发表于 2017-4-19 13:44:35 | 显示全部楼层
方法四:grep误人子弟法
网上另外流传一个错误的方法,即通过grep命令实现:
grep -v -f 1.txt 2.txt 经测试,无论事先是否对两个文件进行sort倒序,此方法输出的结果,发现都是不正确的。
回复 支持 反对

使用道具 举报

58

主题

103

帖子

756

积分

版主

Rank: 7Rank: 7Rank: 7

积分
756
QQ
 楼主| 发表于 2017-4-20 23:26:15 | 显示全部楼层
Art 发表于 2017-4-19 13:44
方法四:grep误人子弟法
网上另外流传一个错误的方法,即通过grep命令实现:
grep -v -f 1.txt 2.txt 经测 ...

然后你最后做出来了么
回复 支持 反对

使用道具 举报

1

主题

6

帖子

130

积分

注册会员

Rank: 2

积分
130
发表于 2017-6-5 22:27:03 | 显示全部楼层
dd,第一个回复
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|生信技能树    

GMT+8, 2019-6-16 19:44 , Processed in 0.062826 second(s), 28 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.