免费注册 查看新帖 |

ChinaUnix.net

  平台 论坛 博客 文库 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
最近访问板块 发新帖
查看: 4259 | 回复: 7

求解 如何输出文件中某一列长度最长的行? [复制链接]

论坛徽章:
0
发表于 2018-06-28 15:43 |显示全部楼层
我有一个基因组文件,其中第一列是染色体名称,第十列是对应的序列,目的是输出 在第一列名称相同的条件下,第十列长度最长的行。

文件大致如下:

EAA1-10       0       scaffold1478    495341  60      24S4359M126I10900M64I917M65I2319M       *       0       0       AATTGGAACGAAATAATTGGAACGAAATAATTGGAACGAAAT
EAA1-10       0       scaffold1478    495341  60      24S4359M126I10900M64I917M65I2319M       *       0       0       AATTGGAACGAAATAATTGGAACGAAAT
EAA1-11       0       scaffold147    495341  60      24S4359M126I10900M64I917M65I2319M       *       0       0       AATTGGAACGAAATAATTGGAACGAAATAATTGGAACGAAAT
EAA1-12       0       scaffold100    495341  60      24S4359M126I10900M64I917M65I2319M       *       0       0       AATTGGAACGAAATAATTGGAACGAAATTGGAACGAAATAATGGAACGAAA
...

请求各位大神指教~

论坛徽章:
6
丑牛
日期:2014-03-21 15:42:04子鼠
日期:2014-04-12 11:50:17处女座
日期:2014-09-01 09:25:1115-16赛季CBA联赛之吉林
日期:2015-12-22 14:01:5215-16赛季CBA联赛之广东
日期:2016-03-08 18:49:422016科比退役纪念章
日期:2016-07-06 12:19:55
发表于 2018-06-28 23:36 |显示全部楼层
这样?
  1. #!perl6
  2. use v6.c;

  3. sub MAIN {
  4.     my $input_file = 'a.txt';
  5.     my %chromosome_hash = %();
  6.     for $input_file.IO.open(:chomp).lines -> $line {
  7.         my @parts = $line.split(/\s+/);
  8.         my $name = @parts[0];
  9.         my $current_seq_length = @parts[9].chars;

  10.         if %chromosome_hash{$name}<length>:exists {
  11.             my $seq_length = %chromosome_hash{$name}<length>;
  12.             if $current_seq_length > $seq_length {
  13.                 %chromosome_hash{$name}<length> = $current_seq_length;
  14.             }
  15.         }
  16.         else {
  17.             %chromosome_hash{$name}<length> = $current_seq_length;
  18.         }
  19.         %chromosome_hash{$name}<line> = $line;
  20.     }

  21.     for %chromosome_hash.values.sort -> $value_hash {
  22.         $value_hash<line>.say;
  23.     }
  24. }
复制代码

论坛徽章:
0
发表于 2018-06-29 10:17 |显示全部楼层
回复 2# stanley_tam

非常感谢!!
我大约看明白您的意思了,但是运行出现了报错:
Scalar value @parts[0] better written as $parts[0] at delete.pl line 10.
Scalar value @parts[9] better written as $parts[9] at delete.pl line 11.
"my" variable %chromosome_hash masks earlier declaration in same scope at delete.pl line 16.
"my" variable $name masks earlier declaration in same scope at delete.pl line 16.
"my" variable $current_seq_length masks earlier declaration in same scope at delete.pl line 16.
"my" variable %chromosome_hash masks earlier declaration in same scope at delete.pl line 20.
"my" variable $name masks earlier declaration in same scope at delete.pl line 20.
"my" variable $current_seq_length masks earlier declaration in same scope at delete.pl line 20.
"my" variable %chromosome_hash masks earlier declaration in same scope at delete.pl line 22.
"my" variable $name masks earlier declaration in same scope at delete.pl line 22.
"my" variable %chromosome_hash masks earlier declaration in same scope at delete.pl line 25.
Warning: Use of "values" without parentheses is ambiguous at delete.pl line 25.
syntax error at delete.pl line 7, near "%() "
syntax error at delete.pl line 8, near "$input_file."
Global symbol "%line" requires explicit package name at delete.pl line 8.
syntax error at delete.pl line 13, near "if %chromosome_hash"
syntax error at delete.pl line 13, near "<length>:"
Execution of delete.pl aborted due to compilation errors.


论坛徽章:
6
丑牛
日期:2014-03-21 15:42:04子鼠
日期:2014-04-12 11:50:17处女座
日期:2014-09-01 09:25:1115-16赛季CBA联赛之吉林
日期:2015-12-22 14:01:5215-16赛季CBA联赛之广东
日期:2016-03-08 18:49:422016科比退役纪念章
日期:2016-07-06 12:19:55
发表于 2018-06-29 16:58 |显示全部楼层
要安装perl6
  1. https://perl6.org/downloads/
复制代码

论坛徽章:
0
发表于 2018-07-13 09:16 |显示全部楼层
回复 4# stanley_tam
我安装失败了,最后一步make install 这里总是有问题,请问大神如果用perl5的话,是不是要改这种中间带点的行啊
for $input_file.IO.open(:chomp).lines -> $line {


论坛徽章:
7
巳蛇
日期:2013-11-28 09:22:59天秤座
日期:2014-10-25 15:40:452015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:53:172015亚冠之德黑兰石油
日期:2015-07-15 08:46:452015亚冠之平阳省
日期:2015-11-08 16:27:53白银圣斗士
日期:2015-11-14 09:58:12
发表于 2018-08-17 11:20 |显示全部楼层

  1. my $Flag={};
  2. my $Data={};
  3. while(my $line=<DATA>){
  4.         chomp;
  5.         my($id,$seq)=(split(/\s+/,$line))[0,-1];
  6.         my $length=length($seq);
  7.         if($Flag->{$id}){
  8.                 if($length>$Flag->{$id}){
  9.                         $Flag->{$id}=$length;
  10.                         $Data->{$id}=$line;
  11.                 }
  12.         }else{
  13.                 $Flag->{$id}=$length;
  14.                 $Data->{$id}=$line;
  15.         }
  16. }
  17. foreach my $id (sort keys %{$Data}){
  18.         print "$Data->{$id}\n";
  19. }


  20. __DATA__
  21. EAA1-10       0       scaffold1478    495341  60      24S4359M126I10900M64I917M65I2319M       *       0       0       AATTGGAACGAAATAATTGGAACGAAATAATTGGAACGAAAT
  22. EAA1-10       0       scaffold1478    495341  60      24S4359M126I10900M64I917M65I2319M       *       0       0       AATTGGAACGAAATAATTGGAACGAAAT
  23. EAA1-11       0       scaffold147    495341  60      24S4359M126I10900M64I917M65I2319M       *       0       0       AATTGGAACGAAATAATTGGAACGAAATAATTGGAACGAAAT
  24. EAA1-12       0       scaffold100    495341  60      24S4359M126I10900M64I917M65I2319M       *       0       0       AATTGGAACGAAATAATTGGAACGAAATTGGAACGAAATAATGGAACGAAA
复制代码


结果

结果

论坛徽章:
0
发表于 2018-08-18 19:42 |显示全部楼层
  1 #!/usr/bin/perl -w
  2 use strict;
  3 use 5.010;
  4
  5 open my $IN_1 , '<' , "orange_in_1.file" or die "can not read! $!\n";
  6 open my $OUT  , '>' , "orange_out.file"  or die "can not write! $!\n";
  7
  8 my %hash;
  9 my @line;
10 while (<$IN_1>) {
11 chomp;
12 @line = split /\s+/;
13 if (exists $hash{$line[0]}) {
14     if (length ($hash{$line[0]}->[8]) < length ($line[9])) {
15     $hash{$line[0]}->[0] = $line[1];
16     $hash{$line[0]}->[1] = $line[2];
17     $hash{$line[0]}->[2] = $line[3];
18     $hash{$line[0]}->[3] = $line[4];
19     $hash{$line[0]}->[4] = $line[5];
20     $hash{$line[0]}->[5] = $line[6];
21     $hash{$line[0]}->[6] = $line[7];
22     $hash{$line[0]}->[7] = $line[8];
23     $hash{$line[0]}->[8] = $line[9];
24 }
25 } else {$hash{$line[0]} = [$line[1], $line[2], $line[3], $line[4], $line[5], $line[6], $line[7], $line[8], $line[9]];}
26 }
27
28 map {print $OUT "$_ $hash{$_}->[0] $hash{$_}->[1] $hash{$_}->[2] $hash{$_}->[3] $hash{$_}->[4] $hash{$_}->[5] $hash{$_}->[6] $hash{$_}->[7] $hash{$_}->[8]\n";} sort keys %hash;
运行结果:见附件图片
FL[FLES@X2XG2$I901E]5LP.png

论坛徽章:
0
发表于 2018-08-18 20:24 |显示全部楼层
回复 6# b114213903

学习学习!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

数据风云,十年变迁
DTCC 第十届中国数据库技术大会已启航!

2019年5月8日~5月10日,由IT168旗下ITPUB企业社区平台主办的第十届中国数据库技术大会(DTCC2019),将在北京隆重召开。大会将邀请百余位行业专家,就热点技术话题进行分享,是广大数据领域从业人士的又一次年度盛会和交流平台。与SACC2018类似,本届大会将采用“3+2”模式:3天传统技术演讲+2天深度主题培训。大会不仅提供超100场的主题演讲,还会提供连续2天的深度课程培训,深化数据领域的项目落地实践方案。
DTCC2019,一场值得期待的数据技术盛会,殷切地希望您报名参与!

活动入口>>
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP