忘记密码   免费注册 查看新帖 | 论坛精华区

ChinaUnix.net

  平台 论坛 博客 认证专区 大话IT HPC论坛 徽章 文库 沙龙 自测 下载 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
12下一页
最近访问板块 发新帖
查看: 1272 | 回复: 18

[文本处理] (已解决)求助,寻找文件中特定内容并输出 [复制链接]

论坛徽章:
0
发表于 2017-09-06 22:24 |显示全部楼层
本帖最后由 greaterwei 于 2017-09-08 23:11 编辑

文件names.dat 包含以下多行内容

Ba2Cu1C6H14O16
I16Cu12S4N4C36H56
Co8N16C96H64O32
Co4N8C48H32O16
Ag6O12N4C10H10
Ag8O16N8C24H8
Ag8O20N8H16C24

现在要求检测names.dat每一行是否含有elements.dat中的内容,
若elements.dat 中内容如下:
Ba
Cu
Co
Ag





则输出文件report.dat的内容应该为:


Ba2Cu1C6H14O16                      Ba, Cu
I16Cu12S4N4C36H56                 Cu
Co8N16C96H64O32                    Co
Co4N8C48H32O16                      Co
Ag6O12N4C10H10                     Ag
Ag8O16N8C24H8                       Ag
Ag8Co1O20N8H16C24               Ag, Co
…                                               …
…                                               …

其中,第二列为找到的内容,以逗号隔开

谢谢!

论坛徽章:
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-09-06 23:15 |显示全部楼层
elements.dat 中的元素长度是否一致决定问题的难易程度。

论坛徽章:
0
发表于 2017-09-06 23:42 |显示全部楼层
本帖最后由 greaterwei 于 2017-09-06 23:43 编辑

回复 2# sunzhiguolu

你好,谢谢前辈的回复。

elements.dat 内容约90行, names.dat 超过60,000行 。。但是每行找到的元素不超过10个

论坛徽章:
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-09-06 23:53 |显示全部楼层
试试看
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. my %hData = ();
  5. while(<DATA>){
  6.         last if(/\A\s*\z/);
  7.         my ($id) = split;
  8.         $hData{length($id)}{$id}++;
  9. }

  10. while(<DATA>){
  11.         my ($s) = split;
  12.         my @aOut = ();
  13.         foreach my $len (sort {$a <=> $b} keys %hData){
  14.                 last if(length($s) < $len);
  15.                 my $b = 0;
  16.                 my $ss = substr($s, $b, $len);
  17.                 while(length($ss) == $len){
  18.                         push(@aOut, $ss) if($hData{$len}{$ss});
  19.                         $b++;
  20.                         $ss = substr($s, $b, $len);
  21.                 }
  22.         }
  23.         print("$s\t", join(',', @aOut), "\n") if(@aOut);
  24. }

  25. __DATA__
  26. Ba
  27. Cu
  28. Co
  29. Ag

  30. Ba2Cu1C6H14O16
  31. I16Cu12S4N4C36H56
  32. Co8N16C96H64O32
  33. Co4N8C48H32O16
  34. Ag6O12N4C10H10
  35. Ag8O16N8C24H8
  36. Ag8O20N8H16C24
复制代码

论坛徽章:
0
发表于 2017-09-07 01:05 |显示全部楼层
回复 4# sunzhiguolu

谢谢前辈,可以运行,但奇怪的是输出的行数总比names.dat中的少。

论坛徽章:
120
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07巳蛇
日期:2014-05-09 16:43:18巨蟹座
日期:2014-10-23 17:48:38子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59
发表于 2017-09-07 04:02 |显示全部楼层
回复 1# greaterwei

$ awk 'FNR==NR{a[$1];next}{len=length;r="";for(n=1;n<len;++n){k=substr($0,n,2);if(k in a)r=r k", "}sub(", $","",r);print $0,r}' elements.dat name.dat | column -t
Ba2Cu1C6H14O16     Ba,  Cu
I16Cu12S4N4C36H56  Cu
Co8N16C96H64O32    Co
Co4N8C48H32O16     Co
Ag6O12N4C10H10     Ag
Ag8O16N8C24H8      Ag
Ag8O20N8H16C24     Ag

论坛徽章:
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-09-07 08:39 |显示全部楼层
回复 5# greaterwei
print("$s\t", join(',', @aOut), "\n");


1人打赏

论坛徽章:
2
程序设计版块每日发帖之星
日期:2016-05-03 06:20:0015-16赛季CBA联赛之同曦
日期:2017-09-11 14:39:48
发表于 2017-09-07 09:07 |显示全部楼层
回复 1# greaterwei

  1. awk 'FILENAME==ARGV[1]{a[$1];next}{s=asorti(a,t);for(i=1;i<=s;i++){if($0~t[i]){b=b?b","t[i]:t[i]}}print $0" "b;b=""}' elements.dat names.dat
复制代码

1人打赏

论坛徽章:
1
CU十四周年纪念徽章
日期:2017-08-28 17:16:19
发表于 2017-09-07 09:40 |显示全部楼层
  1. awk 'NR==FNR{a[$1]=$0 ; next}{for(i in a) if($1~i) s=s?s","i:i ; print $0"\t"s ; s=""}' elements.dat names.dat
复制代码

1人打赏

论坛徽章:
27
15-16赛季CBA联赛之八一
日期:2016-02-22 19:10:4215-16赛季CBA联赛之深圳
日期:2016-12-01 10:34:0415-16赛季CBA联赛之新疆
日期:2016-12-07 10:24:2915-16赛季CBA联赛之同曦
日期:2016-12-15 12:06:43CU十四周年纪念徽章
日期:2016-12-18 13:03:4415-16赛季CBA联赛之吉林
日期:2017-01-03 15:52:2515-16赛季CBA联赛之辽宁
日期:2017-01-04 14:58:2415-16赛季CBA联赛之辽宁
日期:2017-01-15 09:42:512016科比退役纪念章
日期:2017-02-06 17:21:50黑曼巴
日期:2017-02-10 15:46:1215-16赛季CBA联赛之上海
日期:2017-03-18 10:14:5415-16赛季CBA联赛之青岛
日期:2017-03-18 22:00:44
发表于 2017-09-07 12:05 |显示全部楼层

  1. sed -r '1{x;s/.*/cat elements.dat/e;x};G;s/([^\n]*)\n(.*)/\2\n\1@\1/;:a;s/((\<\S+\>))(.*\n[^@]*)(\2)/\3<\4>/;ta;s/>[^<]*</,/g;s/.*<|>[^@]*//g;s/(.*)@(.*)/\2 \1/' names.dat |column -t
复制代码

1人打赏

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

本版积分规则

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP