免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 3484 | 回复: 29

[文本处理] 二个文本内容每行字段的对比 [复制链接]

论坛徽章:
0
发表于 2017-04-14 13:35 |显示全部楼层
求助各位一个很复杂的要求,这里有二个文本,内容是以分号为分隔符的,有些内容是空的,所以默认是空格, 如下:cat 1.txt
host1 ; ip1 ; mac1
host2 ; ip2 ;
host3 ;     ; mac3
host4 ; ip4 ; mac4

cat 2.txt
host1.xx.xx.x ; ip1 ; mac1 ; winpc
host2.xx.xx.x ; ip2 ; mac2 ; linuxpc
host3.xx.xx.x ; ip3 ; mac3 ; linuxpc
host5.xx.xx.x ; ip5 ; mac5 ; winpc


求助大家实现以下目的:
1. 实现文本1和文本2的第一列字符串模糊匹配,认为这个字段是相同的。如host1对比 host1.xxx.com视为相同.
2. 只要文本1.txt每行以;做为间隔的字段有二个字段和文件2.txt相同,则视为相同。另外将2.txt最后的字段也一起将结果导出到新文件3.txt上,如下:
cat 3.txt
host1 ; ip1 ; mac1 ; winpc
host2 ; ip2 ;      ; linuxpc
host3 ;     ; mac3 ; linuxpc




论坛徽章:
0
发表于 2017-04-14 13:36 |显示全部楼层
首先谢谢各位大侠花时间看我的要求, ,希望能得到指点,谢谢!!

论坛徽章:
54
2015亚冠之德黑兰石油
日期:2015-07-07 13:00:1615-16赛季CBA联赛之深圳
日期:2016-03-31 09:03:5415-16赛季CBA联赛之辽宁
日期:2016-05-09 20:38:15程序设计版块每日发帖之星
日期:2016-05-12 06:20:0015-16赛季CBA联赛之四川
日期:2016-05-13 15:19:4715-16赛季CBA联赛之福建
日期:2016-05-15 20:24:34每日论坛发贴之星
日期:2016-05-16 06:20:0015-16赛季CBA联赛之吉林
日期:2016-05-26 11:49:4715-16赛季CBA联赛之广东
日期:2016-05-26 13:49:18极客徽章
日期:2016-12-07 14:05:2315-16赛季CBA联赛之广夏
日期:2016-12-20 17:33:532017金鸡报晓
日期:2017-01-10 15:19:56
发表于 2017-04-14 13:50 |显示全部楼层
  1. awk -F'[;. ]+' 'NR==FNR{a[$1]=$NF;next}a[$1]{sub("$"," ; "a[$1]);print}' b a
复制代码

论坛徽章:
0
发表于 2017-04-14 14:15 |显示全部楼层
本帖最后由 yexingqi 于 2017-04-14 14:16 编辑

谢谢您,太利害了。我用for抓然后对比,总是不能符合我的最终的要求。没想到居然一行命令能实现。
我能请教一下,具体它是怎么起做用的吗?尝试将您这个命令拆分但却不工作了。
awk -F'[;. ]+' 'NR==FNR{a[$1]=$NF;next}a[$1]{sub("$"," ; "a[$1]);print}' 2.txt 1.txt

论坛徽章:
0
发表于 2017-04-14 14:30 |显示全部楼层
回复 3# haooooaaa

谢谢您,太利害了。我用for抓然后对比,总是不能符合我的最终的要求。没想到居然一行命令能实现。
我能请教一下,具体它是怎么起做用的吗?尝试将您这个命令拆分但却不工作了。
awk -F'[;. ]+' 'NR==FNR{a[$1]=$NF;next}a[$1]{sub("$"," ; "a[$1]);print}' 2.txt 1.txt

论坛徽章:
0
发表于 2017-04-14 14:30 |显示全部楼层
回复 3# haooooaaa

谢谢您,太利害了。我用for抓然后对比,总是不能符合我的最终的要求。没想到居然一行命令能实现。
我能请教一下,具体它是怎么起做用的吗?尝试将您这个命令拆分但却不工作了。
awk -F'[;. ]+' 'NR==FNR{a[$1]=$NF;next}a[$1]{sub("$"," ; "a[$1]);print}' 2.txt 1.txt

论坛徽章:
0
发表于 2017-04-14 14:38 |显示全部楼层
回复 3# haooooaaa

如果我再提一个请求,上述对比中再建一个新的输出结果4.txt ,即1.txt指定的二个段跟2.txt相同后,则代替2.txt那一行。同样也将最后的 ; winpc加上。
像这样:
host1 ; ip1 ; mac1 ; winpc
host2 ; ip2 ;      ; linuxpc
host3 ;     ; mac3 ; linuxpc
host5.xx.xx.x ; ip5 ; mac5 ; winpc


请问这又该如何实现呢? 主要是我没理解您这段脚本的具体做法,可否再次麻烦您? 谢谢!

论坛徽章:
54
2015亚冠之德黑兰石油
日期:2015-07-07 13:00:1615-16赛季CBA联赛之深圳
日期:2016-03-31 09:03:5415-16赛季CBA联赛之辽宁
日期:2016-05-09 20:38:15程序设计版块每日发帖之星
日期:2016-05-12 06:20:0015-16赛季CBA联赛之四川
日期:2016-05-13 15:19:4715-16赛季CBA联赛之福建
日期:2016-05-15 20:24:34每日论坛发贴之星
日期:2016-05-16 06:20:0015-16赛季CBA联赛之吉林
日期:2016-05-26 11:49:4715-16赛季CBA联赛之广东
日期:2016-05-26 13:49:18极客徽章
日期:2016-12-07 14:05:2315-16赛季CBA联赛之广夏
日期:2016-12-20 17:33:532017金鸡报晓
日期:2017-01-10 15:19:56
发表于 2017-04-14 14:47 |显示全部楼层
回复 7# yexingqi

  1. awk -F'[;. ]' 'NR==FNR{a[$1]=$0;next}{sub(".+;",a[$1]?a[$1]" ;":"&")}1' a b
复制代码

论坛徽章:
0
发表于 2017-04-14 16:52 |显示全部楼层
回复 8# haooooaaa

谢谢!!!!!!!!祝周未愉快!

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
发表于 2017-04-14 19:18 |显示全部楼层
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. my %hData = ();
  5. while(<DATA>){
  6.     last if(/\A\s*\z/);
  7.     chomp;
  8.     my ($host, $ip, $mac) = split(/\s*;\s*/);
  9.     foreach my $dev ('FULL', $ip, $mac){
  10.         $dev ||= 'NULL';
  11.         $hData{$host}{$dev} = $dev eq 'FULL' ? $_ : 1;
  12.     }
  13. }

  14. while(<DATA>){
  15.     chomp;
  16.     my ($host, $ip, $mac, $other) = split(/\s*;\s*/);
  17.     $host =~ s/\..*//;
  18.     if(exists($hData{$host})){
  19.         print("$hData{$host}{'FULL'}; $other\n");
  20.         next;
  21.     }
  22.     foreach my $hhost (keys %hData){
  23.         next if(!$hData{$hhost}{$ip} or !$hData{$hhost}{$mac});
  24.         print("$hData{$hhost}{'FULL'}; $other\n");
  25.         last;
  26.     }
  27. }

  28. __DATA__
  29. host1 ; ip1 ; mac1
  30. host2 ; ip2 ;
  31. host3 ;     ; mac3
  32. host4 ; ip4 ; mac4

  33. host1.xx.xx.x ; ip1 ; mac1 ; winpc
  34. host2.xx.xx.x ; ip2 ; mac2 ; linuxpc
  35. host3.xx.xx.x ; ip3 ; mac3 ; linuxpc
  36. host5.xx.xx.x ; ip5 ; mac5 ; winpc
  37. host5.xx.xx.x ; ip4 ; mac4 ; winpc

复制代码
perl abc.pl
------------------------------------
host1 ; ip1 ; mac1; winpc
host2 ; ip2 ;; linuxpc
host3 ;     ; mac3; linuxpc
host4 ; ip4 ; mac4; winpc

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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP