免费注册 查看新帖 |

Chinaunix

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

求助;把两个txt文本前6列数字完全相同的行合并后另存?[已解决] [复制链接]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-06-19 23:22 |只看该作者 |倒序浏览
本帖最后由 hkldd 于 2015-06-20 19:52 编辑

  在工作中经常要服务器日志文档中,有相同mac地址的端口与岀现的时间顺序,我想把它们合并后另存方便分析,谢谢大家!

如以下示例;
      对比a.txt文本与b.txt文本,把前6列数字完全相同的行合并后,另存为c.txt文本文件的样式。
a.txt
1d 2c 03 f4 05 6a 55
3c 07 5e 09 1f 1b 45
11 1f 13 4d 15 6c 36
17 8d 19 2c 21 7b 30
23 2c 5b 26 27 8f 3
22 33 44 55 66 77 18
55 66 69 70 71 72 16
26 27 28 29 33 34 13

b.txt
1d 2c 03 f4 05 6a 2015001
3c 07 5e 09 1f 1b 2015002
11 1f 13 4d 15 6c 2015003
17 8d 19 2c 21 7b 2015004
23 2c 5b 26 27 8f 2015005
29 30 31 32 33 36 2015006
01 02 04 05 07 09 2015007

c.txt
1d 2c 03 f4 05 6a 55 2015001
3c 07 5e 09 1f 1b 45 2015002
11 1f 13 4d 15 6c 36 2015003
17 8d 19 2c 21 7b 30 2015004
23 2c 5b 26 27 8f 3  2015005



论坛徽章:
0
2 [报告]
发表于 2015-06-20 14:01 |只看该作者
本帖最后由 pony2001mx 于 2015-06-20 14:04 编辑

见如下脚本(用法是perl program.pl file1 file2),希望有帮助。
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use IO::File;

  5. my $hash1_href = read_file($ARGV[0]);
  6. my $hash2_href = read_file($ARGV[1]);

  7. for my $k (keys %{$hash1_href}) {
  8.         if (exists $hash2_href->{$k}) {
  9.                 print "$k $hash1_href->{$k} $hash2_href->{$k}\n";
  10.         }
  11. }

  12. sub read_file {
  13.         my $file = shift;
  14.         my %hash;
  15.         my $fh = IO::File->new ($file, 'r');
  16.         while (<$fh>) {
  17.         s/\r//; s/^\s*$//;
  18.                 chomp;
  19.                 my @arr = split /\s+/, $_, 7;
  20.                 my $first = join " ", @arr[0..5];
  21.                 $hash{$first} = $arr[6];
  22.         }
  23.         return \%hash;
  24. }
复制代码

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
3 [报告]
发表于 2015-06-20 19:51 |只看该作者
谢谢你pony2001mx大牛人  
  经测试通过,大日志文本处理效率也可以,真心谢谢你帮我解决了大问题,还有一个小请求就是屏幕打印结果,要是能按时间顺序排序一下就更完美了!谢谢!

论坛徽章:
0
4 [报告]
发表于 2015-06-21 16:07 |只看该作者
其实我不是牛人,这里牛人很多,我觉得代码可以写的再短。
请见以下脚本。
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use IO::File;

  5. my $hash1_href = read_file($ARGV[0]);
  6. my $hash2_href = read_file($ARGV[1]);

  7. for my $k (sort { $hash2_href->{$a} <=> $hash2_href->{$b} } keys %{$hash2_href}) {
  8.         if (exists $hash1_href->{$k}) {
  9.                 print "$k $hash1_href->{$k} $hash2_href->{$k}\n";
  10.         }
  11. }

  12. sub read_file {
  13.         my $file = shift;
  14.         my %hash;
  15.         my $fh = IO::File->new ($file, 'r');
  16.         while (<$fh>) {
  17.         s/\r//;        s/^\s*$//;
  18.                 chomp;
  19.                 my @arr = split /\s+/, $_, 7;
  20.                 my $first = join " ", @arr[0..5];
  21.                 $hash{$first} = $arr[6];
  22.         }
  23.         return \%hash;
  24. }
复制代码

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
5 [报告]
发表于 2015-06-21 17:59 |只看该作者
我还在啃perl,对我来说你就是牛人,谢谢你!

论坛徽章:
0
6 [报告]
发表于 2015-06-24 13:01 |只看该作者
新手求教下~请问脚本1和脚本2之间的区别在哪里?
@pony2001mx

论坛徽章:
14
15-16赛季CBA联赛之辽宁
日期:2019-06-16 15:47:3515-16赛季CBA联赛之广夏
日期:2016-08-13 21:24:352015亚冠之武里南联
日期:2015-07-07 17:37:372015亚冠之萨济拖拉机
日期:2015-07-06 17:07:482015亚冠之全北现代
日期:2015-06-04 13:54:272015亚冠之城南
日期:2015-05-21 15:43:212015年亚洲杯之伊朗
日期:2015-04-25 18:20:362015年亚洲杯之伊朗
日期:2015-04-20 16:06:052015年亚洲杯之科威特
日期:2015-03-07 12:51:26丑牛
日期:2014-12-30 10:26:38申猴
日期:2014-09-28 22:40:18金牛座
日期:2014-09-13 21:12:22
7 [报告]
发表于 2015-06-24 14:21 |只看该作者
  1. awk 'NR==FNR{t=$NF;NF--;a[$0]=t}NR>FNR{t=$NF;NF--;if($0 in a) print $0,a[$0],t}' a b
  2. 1d 2c 03 f4 05 6a 55 2015001
  3. 3c 07 5e 09 1f 1b 45 2015002
  4. 11 1f 13 4d 15 6c 36 2015003
  5. 17 8d 19 2c 21 7b 30 2015004
  6. 23 2c 5b 26 27 8f 3 2015005
复制代码

论坛徽章:
60
20周年集字徽章-20	
日期:2020-10-28 14:04:3015-16赛季CBA联赛之北京
日期:2016-07-06 15:42:0715-16赛季CBA联赛之同曦
日期:2016-06-12 10:38:0915-16赛季CBA联赛之佛山
日期:2016-05-27 11:54:56黄金圣斗士
日期:2015-12-02 11:44:35白银圣斗士
日期:2015-11-25 14:32:43白银圣斗士
日期:2015-11-23 12:53:352015亚冠之布里斯班狮吼
日期:2015-10-21 16:55:482015亚冠之首尔
日期:2015-09-01 16:46:052015亚冠之德黑兰石油
日期:2015-08-31 11:39:192015亚冠之萨济拖拉机
日期:2015-08-28 21:06:5315-16赛季CBA联赛之广东
日期:2016-07-12 14:58:53
8 [报告]
发表于 2015-06-24 14:57 |只看该作者
  1. awk 'NR==FNR{t=$0;NF=6;a[$0]=t;next}{w=$NF;NF=6;if($0 in a)print a[$0],w}' a.txt b.txt
复制代码

论坛徽章:
0
9 [报告]
发表于 2015-06-24 16:33 |只看该作者
主要区别是按照时间排序(sort { $hash2_href->{$a} <=> $hash2_href->{$b}语句)。我看到awk命令很强大。
回复 6# biofine


   

论坛徽章:
0
10 [报告]
发表于 2015-06-24 16:41 |只看该作者
嗯。确实强大。谢谢~回复 9# pony2001mx


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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP