免费注册 查看新帖 |

Chinaunix

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

如何以两行为一组进行排序 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2018-05-17 18:54 |只看该作者 |倒序浏览
数据格式如下(原数据无前面的行号):
1 E00548:177:HKH53CCXY:4:2124:24393:26413 99 chr21 164
2 E00548:177:HKH53CCXY:4:2218:4564:50252 163 chr21 164
3 E00548:177:HKH53CCXY:4:2124:24393:26413 147 chr21 -164
4 E00548:177:HKH53CCXY:4:2218:4564:50252 83 chr21 -164
5 E00548:177:HKH53CCXY:4:1222:14357:46261 99 chr21 166
6 E00548:177:HKH53CCXY:4:2101:16478:69730 163 chr21 166
7 E00548:177:HKH53CCXY:4:1109:2564:6144 163 chr21 168
8 E00548:177:HKH53CCXY:4:1119:13971:53293 99 chr21 168
9 E00548:177:HKH53CCXY:4:1222:14357:46261 147 chr21 -166
10 E00548:177:HKH53CCXY:4:2101:16478:69730 83 chr21 -166
11 E00548:177:HKH53CCXY:4:1109:2564:6144 83 chr21 -168
12 E00548:177:HKH53CCXY:4:1119:13971:53293 147 chr21 -168
13 E00548:177:HKH53CCXY:4:1114:31842:4720 163 chr21 110
14 E00548:177:HKH53CCXY:4:2118:31558:20014 99 chr21 110
15 E00548:177:HKH53CCXY:4:1114:31842:4720 83 chr21 -110
16 E00548:177:HKH53CCXY:4:2118:31558:20014 147 chr21 -110

一共4列,想以两行为一个单位,分别找到与这两行第一列相同的另外两行,然后将这四行放在一起输出,例如上述结果应该是:
1 E00548:177:HKH53CCXY:4:2124:24393:26413 99 chr21 164
2 E00548:177:HKH53CCXY:4:2218:4564:50252 163 chr21 164
3 E00548:177:HKH53CCXY:4:2124:24393:26413 147 chr21 -164
4 E00548:177:HKH53CCXY:4:2218:4564:50252 83 chr21 -164
5 E00548:177:HKH53CCXY:4:1222:14357:46261 99 chr21 166
6 E00548:177:HKH53CCXY:4:2101:16478:69730 163 chr21 166
9 E00548:177:HKH53CCXY:4:1222:14357:46261 147 chr21 -166
10 E00548:177:HKH53CCXY:4:2101:16478:69730 83 chr21 -166
7 E00548:177:HKH53CCXY:4:1109:2564:6144 163 chr21 168
8 E00548:177:HKH53CCXY:4:1119:13971:53293 99 chr21 168
11 E00548:177:HKH53CCXY:4:1109:2564:6144 83 chr21 -168
12 E00548:177:HKH53CCXY:4:1119:13971:53293 147 chr21 -168
13 E00548:177:HKH53CCXY:4:1114:31842:4720 163 chr21 110
14 E00548:177:HKH53CCXY:4:2118:31558:20014 99 chr21 110
15 E00548:177:HKH53CCXY:4:1114:31842:4720 83 chr21 -110
16 E00548:177:HKH53CCXY:4:2118:31558:20014 147 chr21 -110

实际就是调整一下数据的存放位置,像这里就是换了一下7、8与9、10行的位置

论坛徽章:
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
2 [报告]
发表于 2018-05-17 20:04 |只看该作者
一共4列,说的什么?我看前面4列都一样
“分别找到与这两行第一列相同的另外两行” 说的最后一列吧。。。

论坛徽章:
0
3 [报告]
发表于 2018-05-18 08:48 |只看该作者
回复 2# stanley_tam

以制表符分隔的,一共4列,E00548:177:HKH53CCXY:4:2124:24393:26413这个是第一列,以2行为1个单位,5、6行与9、10行第一列是分别相等的,但是没挨在一起,所以想调整一下顺序

论坛徽章:
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
4 [报告]
发表于 2018-05-19 13:19 |只看该作者
如果顺序不重要,直接sort一下行不行。。。
  1. #!perl
  2. use strict;
  3. use warnings;
  4. use autodie qw{open close};
  5. use Tie::File;

  6. sub main;
  7. sub get_first_column;

  8. main;

  9. sub main {
  10.     my $file = 'a.txt';
  11.     my $col_lino_map = +{};
  12.     open my $fh, '<', $file;
  13.     my $index = 0;
  14.     while (my $line = readline $fh) {
  15.         my $col1 = get_first_column($line);
  16.         my $next_line = readline $fh;
  17.         my $col2 = get_first_column($next_line);
  18.         my $col_mark = "$col1$col2";
  19.         if (exists $col_lino_map->{$col_mark}) {
  20.             $col_mark = $col_mark . '1';
  21.         }
  22.         $col_lino_map->{$col_mark} = [$index, $index+1];
  23.         $index += 2;
  24.     }
  25.     close $fh;

  26.     tie my @lines, 'Tie::File', $file or die "fail to tie file $file$/";
  27.     my @sorted_col_mark = sort {$a cmp $b} keys %{$col_lino_map};
  28.     open my $out_fh, '>', 'out.txt';
  29.     for my $col_mark (@sorted_col_mark) {
  30.         print {$out_fh} "$lines[$_]$/" for @{$col_lino_map->{$col_mark}}
  31.     }
  32.     untie @lines;
  33. }

  34. sub get_first_column {
  35.     return (split /\s+/, shift())[0];
  36. }

  37. __END__
复制代码

论坛徽章:
0
5 [报告]
发表于 2018-05-19 15:31 |只看该作者
回复 4# stanley_tam

不能直接sort,因为这四行的第4列绝对值是相同的,这是一组,不能打乱了,你这个脚本好像没用啊,既没有报错,也没有什么结果产生

论坛徽章:
0
6 [报告]
发表于 2018-05-19 16:03 |只看该作者
回复 4# stanley_tam

多谢,我已经找到方法了,的确是可以直接sort,根据第四列大小sort
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP