免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3635 | 回复: 7
打印 上一主题 下一主题

txt文件随机提取1000个字符的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-05-27 10:07 |只看该作者 |倒序浏览
我需要从txt 文件中随机提取1000个字符并且输出到新文件,但是同时我也需要知道随机输出字符的具体位置,而且提取字符仅限与碱基“acgt".下面是文件的大体格式:
I      id       1001     1002       1003...
M     id0101 A          G           T...
M     id0102 G          T           c....
.....
大体这种感觉,有11万行左右,1200列左右
求大家帮帮忙
walklan 该用户已被删除
2 [报告]
发表于 2015-05-27 11:28 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
3 [报告]
发表于 2015-05-27 12:38 |只看该作者
非常感谢您的回复,但是可以稍微详细的说明一下吗?我看不懂啊QAQ回复 2# walklan


   
walklan 该用户已被删除
4 [报告]
发表于 2015-05-27 12:54 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
5 [报告]
发表于 2015-05-27 13:09 |只看该作者
子函数里面的为什么是16和4呢?回复 4# walklan


   
walklan 该用户已被删除
6 [报告]
发表于 2015-05-27 13:11 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
7 [报告]
发表于 2015-05-27 13:40 |只看该作者
那可以具体的告诉我这个测试代码中每一行的意思吗?嫌麻烦的话可以告诉我每个数字代表的含义就好,可以吗?回复 6# walklan


   

论坛徽章:
0
8 [报告]
发表于 2015-05-27 15:54 |只看该作者
本帖最后由 ba_du_co 于 2015-05-27 15:57 编辑

大体是这种感觉

测试样例:: 文件 TEST.data

  1. I      id       1001     1002       1003
  2. M     id0101 A          G           T
  3. N     id0102 G          T           c
  4. O     id0103 A          G           T
  5. P     id0104 G          T           c
  6. Q     id0105 A          G           T
  7. R     id0106 G          T           c
  8. S     id0107 A          G           T
  9. T     id0108 G          T           c
复制代码
提取字符 3 个::
输出大约是这种感觉::
提取字符 大体有 3 个 左右
文件 TEST.data 大体有 9 行 左右
文件 TEST.data 大体有 5 列 左右

开始提取字符::

随机字符 < T > 具体位置大体在:: 行 3, 列 4 [ N id0102, id: 1002 ]
随机字符 < T > 具体位置大体在:: 行 6, 列 5 [ Q id0105, id: 1003 ]
随机字符 < G > 具体位置大体在:: 行 8, 列 4 [ S id0107, id: 1002 ]

大体是这种感觉




测试::        perl 代码.pl
输出到新文件:: perl 代码.pl > 新文件


大约是这种感觉的代码::
  1. #!/usr/bin/perl

  2. use 5.020;

  3. my $file      = 'TEST.data';
  4. my $picks     = 3; # 随机提取 XXX 个字符
  5. my $last_line = 1;
  6. my %line_numbers;

  7. open my ($handle), $file or die "$!: [ $file ] >>";
  8. die "DIE:: 这个操作系统大约不是 linux!\n" if $^O ne 'linux';

  9. my ($lines) = split /\s+/, `wc -l $file`;
  10. my ( undef, undef, @id ) = split /\s+/, <$handle>;
  11. my $cols = @id;

  12. $lines -= 1;

  13. while ( keys %line_numbers < $picks ) {
  14.     my $this_line = int rand $lines;
  15.     next if exists $line_numbers{$this_line};
  16.     $line_numbers{$this_line} = undef;
  17.     $last_line = $this_line if $last_line < $this_line;
  18. }

  19. $last_line += 2;
  20. %line_numbers = map { $_ + 2 => undef } keys %line_numbers;

  21. say STDERR "提取字符 大体有 $picks 个 左右",;
  22. say STDERR "文件 $file 大体有 ", 1 + $lines, ' 行 左右';
  23. say STDERR "文件 $file 大体有 ", 2 + $cols,  ' 列 左右';
  24. say STDERR "\n开始提取字符::\n";

  25. while (<$handle>) {
  26.     next unless exists $line_numbers{$.};
  27.     my ( $first, $identification, @characters ) = split;
  28.     my $irc = int rand $cols;
  29.     print "随机字符 < $characters[$irc] > 具体位置大体在:: 行 $., 列 ";
  30.     print $irc + 3, " [ $first $identification, id: $id[$irc] ]\n";
  31.     last if $. == $last_line;
  32. }

  33. close $handle;
  34. say STDERR "\n大体是这种感觉\n";

  35. __DATA__
  36. I      id       1001     1002       1003
  37. M     id0101 A          G           T
  38. N     id0102 G          T           c
  39. O     id0103 A          G           T
  40. P     id0104 G          T           c
  41. Q     id0105 A          G           T
  42. R     id0106 G          T           c
  43. S     id0107 A          G           T
  44. T     id0108 G          T           c

复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP