Chinaunix
标题:
文本处理
[打印本页]
作者:
lifayi2008
时间:
2016-11-02 14:20
标题:
文本处理
本帖最后由 lifayi2008 于 2016-11-02 14:26 编辑
文件1
河北省 石家庄市 市辖区
河北省 石家庄市 长安区
河北省 石家庄市 桥东区
河北省 石家庄市 桥西区
河北省 石家庄市 新华区
河北省 石家庄市 井陉矿区
.............
.............
河北省 衡水市 武邑县
河北省 衡水市 武强县
河北省 衡水市 饶阳县
河北省 衡水市 安平县
河北省 衡水市 故城县
河北省 衡水市 景 县
河北省 衡水市 阜城县
河北省 衡水市 冀州市
............
还有其他全国省市
复制代码
文件2
河北省
石家庄市
市辖区
井陉矿区
长安区
桥东区
桥西区
这个肯定不在
.................
.................
邯郸市
丛台区
复兴区
峰峰矿区
广平县
邱县
魏县
................
还有其他全国省市
复制代码
以 文件1 为正确信息 找出 文件2 中 县/区 不正确的
不正确包括: 县/区 不存在 或者 县/区 不在这个市
先谢谢各位
作者:
sunzhiguolu
时间:
2016-11-02 15:58
#!/usr/bin/perl
use strict;
use warnings;
use utf8;
binmode (STDOUT, ':encoding(utf8)');
my %hData;
open (my $FHr, '<:encoding(utf8)', shift);
while (defined (local $_ = <$FHr>)){
my ($prov, $city, $dist) = split;
$hData{$prov}{$city}{$dist}++;
}
close ($FHr);
open ($FHr, '<:encoding(utf8)', shift);
my ($prov, $city);
my $rgx = qr /[\x{4E00}-\x{9FA5}]+/;
while (defined (local $_ = <$FHr>)){
if (/(${rgx}省)/){
$prov = $1;
next;
}
if (/(${rgx}市)/){
$city = $1;
next;
}
print join (",", $prov, $city, $1), "\n" if (/($rgx)/ xor exists $hData{$prov}{$city}{$1});
}
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
all = {}
with open("a") as f:
for i in f:
tmp = i.strip().split()
for j,k in enumerate(tmp[:-1]):
if "%*s%s" % (j*4, "", tmp[j].decode('utf-8')) not in all:
print "%*s%s" % (j*4, "", tmp[j].decode('utf-8'))
all["%*s%s" % (j*4, "", tmp[j].decode('utf-8'))] = None
print "%*s%s" % ((len(tmp)-1)*4," ", tmp[-1].decode('utf-8'))
复制代码
作者:
haooooaaa
时间:
2016-11-02 17:50
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
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
grep -vFf 1 3
复制代码
?
作者:
sditmaner
时间:
2016-11-05 12:44
强烈支持楼主ing……
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2