用perl 语言,把一个文件里面的一部分内容写到另一个文件里的方法。谢谢!

源文内容格式如下:中文12345678中文11111111中文字符1中文23456781中文11111111中文字符1.......中文34567812中文2222222... 源文内容格式如下:
中文12345678 中文11111111 中文字符1
中文23456781 中文11111111 中文字符1
.......
中文34567812 中文22222222 中文11111111 中文字符2
中文45678123 中文22222222 中文11111111 中文字符2
.........
(用PERL语言替换后的)目标文件内容如下
中文11111111 中文字符1
中文22222222 中文字符2
刚才考错了,更正下:
源文件内容格式如下:
中文12345678 中文xxxxxxx1 中文字符1
中文23456781 中文xxxxxxx1 中文字符1
34567812 中文xxxxxxx2 中文字符1
中文45678123 中文xxxxxxx3 中文字符1
中文56781234 中文xxxxxxx1 中文xxxxxxx4 中文字符2
中文67812345 中文xxxxxxx2 中文xxxxxxx5 中文字符2
(用PERL语言替换后的)目标文件内容如下
中文xxxxxxx1 中文字符1
中文xxxxxxx2 中文字符1
中文xxxxxxx3 中文字符1
中文xxxxxxx4 中文字符2
中文xxxxxxx5 中文字符2
xxxxxx值是不确定的,行数也不确定。
确定值有3个
中文
中文字符1
中文字符2
老师辛苦了。
展开
 我来答
动力不强
推荐于2016-04-04 · TA获得超过554个赞
知道小有建树答主
回答量:445
采纳率:0%
帮助的人:367万
展开全部

 如果只要求倒数第二列不重复,则:

#!/usr/bin/perl
# test.pl
use strict;
my %keys;
while(<>) {
   my @ary = split /\t/;
   if(! $keys{$ary[-2]}) {                      
       $keys{$ary[-2]} = 1;
       print "$ary[-2]\t$ary[-1]";
   }
}

如果要求两列都不重复,则:

#!/usr/bin/perl
use strict;
my %keys;
while(<>) {
   my @ary = split /\t/;
   if(! $keys{$ary[-2].".".$ary[-1]}) {
       $keys{$ary[-2].".".$ary[-1]} = 1;
       print "$ary[-2]\t$ary[-1]";
   }
}

用法:test.pl < source.txt > target.txt

运行结果,用给出的数据测试,结果均为:

中文xxxxxxx1    中文字符1
中文xxxxxxx2    中文字符1
中文xxxxxxx3    中文字符1
中文xxxxxxx4    中文字符2
中文xxxxxxx5    中文字符2
匿名用户
2013-06-21
展开全部

不知道什么原因,今天我发的回答都显示不出来,只能用匿名发送试试看。(jasonqwu)

做了一个脚本,在我的机器上试过了:

use 5.016;
use warnings;
use utf8;

my %target;
my $source_file = 'original.txt';
my $target_file = 'target.txt';
my $source_file_fh; # your source file handle
my $target_file_fh; # your target file handle
my $key; # key item in target file
my $content; # last content item in target file

open($source_file_fh, "<encoding(utf8)", $source_file) or die "Can't open $source_file : $!\n";
open($target_file_fh , ">:utf8", $target_file) or die "Can't open $target_file : $!\n";
while (<$source_file_fh>) {
$content = get_last_item($_);
$key = get_key($_, $content);
$target{$key} = $content if ($key);
}
for (sort keys %target) {
say $target_file_fh "$_ $target{$_}";
}
close $target_file_fh;
close $source_file_fh;

sub get_last_item {
my $str = shift;

$str =~ /.*[ ]+(.*)/;
return $1;
}

sub get_key {
my $str = shift;
my $content = shift;

$str =~ /.*[ ]+(.*)[ ]+$content/;
return $1;
}

按照新的要求,修改了代码,请确认。

追问
运行结果:
perl -c test3.pl
test3.pl syntax OK
但是结果没有写入文件target.txt里
中文xxxxxxx1 中文字符1
中文xxxxxxx2 中文字符1
中文xxxxxxx3 中文字符1
中文xxxxxxx4 中文字符2
中文xxxxxxx5 中文字符2
追答
original.txt有没有放在test3.pl同一个目录?对了,perl -c 不行的,只是编译检查,请用perl -w test3.pl
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
非我即仙
2013-06-21 · TA获得超过568个赞
知道小有建树答主
回答量:303
采纳率:0%
帮助的人:397万
展开全部

是否可以假定所有行都是3列(以空格分割),那么所需要做的工作其实就是替换去除第一列

此时只需要

perl -F -pe 'print "@F[1,2]"‘ source.txt > target.txt
追问
有3列,也有4列
每列是Tab分开的。
都取后2列
不取重复的,谢谢
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式