Chinaunix

标题: 文本处理 [打印本页]

作者: lifayi2008    时间: 2016-11-02 14:20
标题: 文本处理
本帖最后由 lifayi2008 于 2016-11-02 14:26 编辑

文件1
  1. 河北省 石家庄市 市辖区
  2. 河北省 石家庄市 长安区
  3. 河北省 石家庄市 桥东区
  4. 河北省 石家庄市 桥西区
  5. 河北省 石家庄市 新华区
  6. 河北省 石家庄市 井陉矿区
  7. .............
  8. .............
  9. 河北省 衡水市 武邑县
  10. 河北省 衡水市 武强县
  11. 河北省 衡水市 饶阳县
  12. 河北省 衡水市 安平县
  13. 河北省 衡水市 故城县
  14. 河北省 衡水市 景 县
  15. 河北省 衡水市 阜城县
  16. 河北省 衡水市 冀州市
  17. ............
  18. 还有其他全国省市

复制代码
文件2
  1. 河北省
  2.         石家庄市
  3.             市辖区
  4.             井陉矿区
  5.             长安区
  6.             桥东区
  7.             桥西区
  8.             这个肯定不在
  9. .................
  10. .................
  11.         邯郸市
  12.             丛台区
  13.             复兴区
  14.             峰峰矿区
  15.             广平县
  16.             邱县
  17.             魏县
  18. ................
  19. 还有其他全国省市
复制代码

以 文件1 为正确信息    找出 文件2 中 县/区 不正确的

不正确包括: 县/区 不存在  或者  县/区 不在这个市


先谢谢各位
作者: sunzhiguolu    时间: 2016-11-02 15:58
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use utf8;

  5. binmode (STDOUT, ':encoding(utf8)');

  6. my %hData;
  7. open (my $FHr, '<:encoding(utf8)', shift);
  8. while (defined (local $_ = <$FHr>)){
  9.     my ($prov, $city, $dist) = split;
  10.     $hData{$prov}{$city}{$dist}++;
  11. }
  12. close ($FHr);

  13. open ($FHr, '<:encoding(utf8)', shift);
  14. my ($prov, $city);
  15. my $rgx = qr /[\x{4E00}-\x{9FA5}]+/;
  16. while (defined (local $_ = <$FHr>)){
  17.     if (/(${rgx}省)/){
  18.         $prov = $1;
  19.         next;
  20.     }
  21.     if (/(${rgx}市)/){
  22.         $city = $1;
  23.         next;
  24.     }
  25.     print join (",", $prov, $city, $1), "\n" if (/($rgx)/ xor exists $hData{$prov}{$city}{$1});
  26. }
  27. close ($FHr);
复制代码


cat a
----------------------------------------------------------------
河北省 石家庄市 市辖区
河北省 石家庄市 长安区
河北省 石家庄市 桥东区
河北省 石家庄市 桥西区
河北省 石家庄市 新华区
河北省 石家庄市 井陉矿区
河北省 衡水市 武邑县
河北省 衡水市 武强县
河北省 衡水市 饶阳县
河北省 衡水市 安平县
河北省 衡水市 故城县
河北省 衡水市 景 县
河北省 衡水市 阜城县
河北省 衡水市 冀州市

cat b
------------------------------------------
河北省
        石家庄市
            市辖区
            井陉矿区
            长安区
            桥东区
            桥西区
                        网线
        邯郸市
            丛台区
            复兴区
            峰峰矿区
            广平县
            邱县
            魏县

perl abc.pl a b
-------------------------------------------------
河北省,石家庄市,网线
河北省,邯郸市,丛台区
河北省,邯郸市,复兴区
河北省,邯郸市,峰峰矿区
河北省,邯郸市,广平县
河北省,邯郸市,邱县
河北省,邯郸市,魏县

作者: lifayi2008    时间: 2016-11-02 17:03
回复 2# sunzhiguolu

tks   可以使用  就是perl不懂

作者: haooooaaa    时间: 2016-11-02 17:45
  1. all = {}
  2. with open("a") as f:
  3.     for i in f:
  4.         tmp = i.strip().split()     
  5.         for j,k in enumerate(tmp[:-1]):
  6.             if "%*s%s" % (j*4, "", tmp[j].decode('utf-8')) not in all:
  7.                 print "%*s%s" % (j*4, "", tmp[j].decode('utf-8'))
  8.                 all["%*s%s" % (j*4, "", tmp[j].decode('utf-8'))] = None
  9.         print "%*s%s" % ((len(tmp)-1)*4," ", tmp[-1].decode('utf-8'))  
复制代码

作者: haooooaaa    时间: 2016-11-02 17:50
  1. awk '{s=f;for(i=1;i<NF;i++){s=sprintf("%*s%s",(i-1)*4,"",$i);if(!(s in a)){print s;a[s]}}printf "%8s%s\n","",$NF}' a
复制代码

作者: sunzhiguolu    时间: 2016-11-02 18:17
本帖最后由 sunzhiguolu 于 2016-11-02 21:29 编辑

回复 3# lifayi2008
意思弄错了.


作者: sunzhiguolu    时间: 2016-11-02 18:22
本帖最后由 sunzhiguolu 于 2016-11-02 21:30 编辑

意思弄错了.

作者: moperyblue    时间: 2016-11-02 22:30
本帖最后由 moperyblue 于 2016-11-02 22:31 编辑

文件2
"市" 前面的缩进一致吗? 如 都是8个空格?
"区/县" 前面的缩进一致吗? 如 都是12个空格?
作者: jason680    时间: 2016-11-02 22:56
回复 1# lifayi2008

$ awk --posix 'FNR==NR{a[$1,$2,$3]=a[$1,$2]=1;next}/^ {12}/{if(!a[s1,s2,$1])print s,c,$1;next}/^ {8}/{c=$1;if(!a[s,c])print s,c;next}{s=$1}' f1 f2
河北省 石家庄市 市辖区
河北省 石家庄市 这个肯定不在
河北省 邯郸市
河北省 邯郸市 丛台区
河北省 邯郸市 魏县



$ cat f2
河北省
        石家庄市
            市辖区
            这个肯定不在
        邯郸市
            丛台区
            魏县


作者: lifayi2008    时间: 2016-11-04 17:48
回复 9# jason680

非常感谢

作者: moperyblue    时间: 2016-11-05 09:55

  1. sed -r '/^\S/h;/^\s{8}\b/{G;s/ \S+$//;s/\s+(.*)\n(.*)/\2 \1/;h};/^\s{12}\b/{G;s/\s+(.*)\n(.*)/\2 \1/p};d' 2 > 3
  2. grep -vFf 1 3
复制代码

?
作者: sditmaner    时间: 2016-11-05 12:44
强烈支持楼主ing……





欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2