忘记密码   免费注册 查看新帖 |

ChinaUnix.net

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

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

论坛徽章:
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
发表于 2018-05-17 20:04 |显示全部楼层
一共4列,说的什么?我看前面4列都一样
“分别找到与这两行第一列相同的另外两行” 说的最后一列吧。。。

论坛徽章:
0
发表于 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
发表于 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
发表于 2018-05-19 15:31 |显示全部楼层
回复 4# stanley_tam

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

论坛徽章:
0
发表于 2018-05-19 16:03 |显示全部楼层
回复 4# stanley_tam

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

本版积分规则

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802020122
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:wangnan@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP