免费注册 查看新帖 |

Chinaunix

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

求文本处理,各位大虾来看看 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-05-05 07:11 |只看该作者 |倒序浏览
本帖最后由 perlnewbie 于 2011-05-05 08:48 编辑
  1. aaaa 中中中中中中国中
  2. bbbb
  3. aaaa
复制代码
如果前面的 英文字母列相同,则将后面有中文的那一行输出.如上面三行中有2行aaaa相同  ,则打印出 aaaa 中中中中中中国中


搜到这贴子http://bbs.chinaunix.net/viewthread.php?tid=1866992 ziyunfei大牛的答案:
perl -ane 'if(!$a{@F[5..8]}){$a{@F[5..8]}=print}' file

我照葫芦画虎的抄了一下,好像也马马虎虎满足需求.哈哈,

  1. perl -ane 'if(!$a{@F[0]}){$a{@F[0]}=print}' 1.txt
复制代码
但有一个不足的地方就是,如果aaaa 中中中中中中国中 排在 aaaa行的后面,就无法打印出跟中文的那行了.唉,不懂.啊.能指教下吗?


2.如果我只需要打印aaaa 中中中中中中国中 这样的行 又怎么做呢?
如,
  1. aaaa 中中中中中中国中
  2. bbbb
  3. aaaa
  4. bbbb 金金金金金金
复制代码
我希望得到

  1. aaaa 中中中中中中国中
  2. bbbb 金金金金金金
复制代码

论坛徽章:
0
2 [报告]
发表于 2011-05-05 08:35 |只看该作者
ziyunfei?不是俺。

论坛徽章:
0
3 [报告]
发表于 2011-05-05 08:45 |只看该作者
回复 2# 2gua


    晕.  你知道也可指点下啊,   看来不能在cu这么发问,

论坛徽章:
0
4 [报告]
发表于 2011-05-05 09:38 |只看该作者
如果数据量不大,可以这样做:
  1. #!/usr/bin/perl

  2. use strict;
  3. use warnings;

  4. open(FH,"data.txt");
  5. my @lines = <FH>;
  6. chomp @lines;
  7. close FH;

  8. my %check;
  9. foreach (@lines)
  10. {
  11.         my (@data) = split /\s+/;
  12.         $check{$data[0]} = 1 if ($#data < 1);
  13. }
  14. foreach (@lines)
  15. {
  16.         my (@data) = split /\s+/;
  17.         print "$_\n" if ($check{$data[0]} && $#data >= 1);
  18. }
复制代码

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
5 [报告]
发表于 2011-05-05 09:49 |只看该作者
回复 1# perlnewbie
  1. perl -ane 'if(${F[1]}){print}'
复制代码

论坛徽章:
0
6 [报告]
发表于 2011-05-05 10:03 |只看该作者
本帖最后由 perlnewbie 于 2011-05-05 10:06 编辑

非常谢谢.

        $check{$data[0]} = 1 if ($#data < 1);
       这句不太懂呀,能解释下吗?

感觉我完全不适合编程.....   数组和哈希让我有种云里雾里的感觉.....可是偶尔又会遇到很无奈的文本处理......只得学呀...

另外怎么䃼分在回答者?,发贴忘了悬赏了,在这个论坛解决了我的许多文本处理问题,怎么说也得意思意思一下啊

论坛徽章:
0
7 [报告]
发表于 2011-05-05 10:18 |只看该作者
回复 3# perlnewbie


    这个加个判断就可以了吧
  1. perl -ane 'if(!$a{@F[0]} and $F[1] ne ""){$a{@F[0]}=print}' 1.txt
复制代码

论坛徽章:
0
8 [报告]
发表于 2011-05-05 10:26 |只看该作者
本帖最后由 perlnewbie 于 2011-05-05 10:31 编辑

还无法用perl表达自己的逻辑唉...
四楼的很好啊

七楼和五楼给的会把后面跟了中文但没有重复的行也打印出来.如:

  1. aaaa 中中中中中中国中
  2. bbbb
  3. aaaa
  4. bbbb 金金金金金金
  5. dddd 你
  6. cccc
复制代码
会输出
aaaa 中中中中中中国中
bbbb 金金金金金金
dddd 你

论坛徽章:
0
9 [报告]
发表于 2011-05-05 10:55 |只看该作者
这个问题,我感觉用一句的Perl代码是非常困难的,那会异常复杂,不如老实写几行来得方便。

这种问题,也算是哈希的典型应用,建议楼主多看一下小骆驼。

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期: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未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
10 [报告]
发表于 2011-05-05 12:15 |只看该作者
本帖最后由 jason680 于 2011-05-05 12:27 编辑
还无法用perl表达自己的逻辑唉...
四楼的很好啊

七楼和五楼给的会把后面跟了中文但没有重复的行 ...
perlnewbie 发表于 2011-05-05 10:26



$ cat test.txt
aaaa 中中中中中中国中
bbbb
aaaa
bbbb 金金金金金金
dddd 你
cccc

$ cat test.txt | perl -lane '{$k=$F[0];$c{$k}++;if(! exists $t{$k}){$t{$k}=$_};if(length($t{$k}) <= length($_)){$t{$k}=$_}}END{foreach(keys %c){if($c{$_}>=2){print $t{$_}}}}'
aaaa 中中中中中中国中
bbbb 金金金金金金

$ cat double.pl

  1. use strict;
  2. use warnings;

  3. use utf8;

  4. my $sKey;
  5. my %hCount;
  6. my %hText;

  7. while(<>){
  8.    $sKey = (split)[0];
  9.    $hCount{$sKey}++;
  10.    if(! exists $hText{$sKey}){
  11.         $hText{$sKey} = $_;
  12.    }
  13.    if( length($_) >= length($hText{$sKey})){
  14.         $hText{$sKey} = $_;
  15.    }
  16. }
  17. foreach(keys %hCount){
  18.    print $hText{$_} if($hCount{$_} >=2);
  19. }
复制代码
$ perl double.pl test.txt
aaaa 中中中中中中国中
bbbb 金金金金金金
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP