请问用Perl来直接替换GAWK使用,可行吗

请问用Perl来直接替换GAWK使用,可行吗

经常使用gawk,处理的是一些TAB分割字段的纯文本文件,就相当于excel文件,文件每格的数据,有些是字母,有些是数字,夹带少量特殊字符(#号,-号等),有些格子为空。

最近有个求相似度的处理,需得用Perl来完成,需要对比的是中间某两列的数据,其它数据照旧。

本来原来的方案是把这两列先提出来,用perl代码处理好以后再用gawk匹配回去,但这样效率太低了。

所以我想着,能不能直接就用Perl来处理这一步,只对比这两列数据,其它列原封不动保留下来。

请问这样是否可行呢?我该怎么做啊。

谢谢:)
在文本处理方面,perl是最强大的。
那可否麻烦给一个思路呢
gawk那样的直接分段处理的功能(-F; FS=),在Perl里怎么替代呢,用split吗?

如果是用split的话,会不会出异常呢,另外split后,能保证数据段跟gawk处理的一致吗,然后用数组里固定下标的字段来处理吗

(因为要把对比结果放到末尾新加一列里,split记得后面为空的就直接去掉了,这样似乎添加这一列就比较麻烦了吧,会位置不对应的吧)


QUOTE:
原帖由 pooronce 于 2008-9-4 09:24 发表
那可否麻烦给一个思路呢
gawk那样的直接分段处理的功能(-F; FS=),在Perl里怎么替代呢,用split吗?

如果是用split的话,会不会出异常呢,另外split后,能保证数据段跟gawk处理的一致吗,然后用数组里固定下 ...

空谈是没用的,给点数据(数据不在多,但要尽量覆盖你要处理的所有情况),说明规则,再给出你想要的结果。
啊,抱歉,这里给个示例文本:

[Copy to clipboard] [ - ]
CODE:
casadeventas.com                N A                7                0                                casadeventas        174
allaripidugu.com                N A                9                0        allari pidugu                        allaripidugu        49.4
ruffneckmagazine.com        42        N A                19        ruffnecksmagazine.com        0        ruffnecksmagazine                30        ruffneckmagazine        44.375
ahungrybottom.com                N A                13                0                                ahungrybottom        63
baliyourhome.com                N A                3        valueyourhome.com        0        valueyourhome                        baliyourhome        63
enhancedsales.net                N A                11                0        enhanced sales                        enhancedsales        63
nagiksunglasses.com                N A                2        nikesunglasses.com        1        nike sunglasses                        nagiksunglasses        62
cowtowncustompillows.com                N A                17                0                                cowtowncustompillows        60
elovetelevision.com                N A                16                0        elove television                        elovetelevision        57
prestigeproductions.com                N A                39                0        prestige productions                17        prestigeproductions        57
leathermansdungeon.com                N A                19        leather mensdungeon.com        0        leathermensdungeon                16        leathermansdungeon        34.66666667

这里就是要将A列跟F列对比,即nagiksunglasses.com跟nikesunglasses.com对比,中间的分割符都是TAB。 将比较结果放到末尾新增一列
一切皆有可能。
你问ly5066113 是问对人了。他对awk也相当的精通。不信去shell版看看他写的awk,那是相当的。。。。。
示例文件:
http://pickup.mofile.com/0322802956503773
其实主要是思路,我是Perl新手啊,各方面不熟
有方向的话就好办了,我自己慢慢折腾出来最好了


QUOTE:
原帖由 pooronce 于 2008-9-4 09:44 发表
啊,抱歉,这里给个示例文本:

casadeventas.com                N A                7                0                                casadeventas        174
allaripidugu.com                N A                9                0        allari pidugu                        allaripidugu        49.4
ruffneckmagazine.com        42        N A                19        ruffnecksmagazine.co ...

全是空格,根本分不出哪是F列,还是根据你给的代码稍微改改吧。

[Copy to clipboard] [ - ]
CODE:
#!/usr/bin/perl

use v5.10;

use strict;
use warnings;

#use Smart::Comments;
use Algorithm::Diff;

open(F ,"<urfile") or die;

while(<F>){
chomp;
my ($base, $tmp1,$tmp2,$tmp3,$tmp4,$word) = split /\t/;

   if ($word ne ""){

        my $diff = Algorithm::Diff::sdiff( [split //, $base], [split //, $word] );

        my ($line1, $line2, $count);
        foreach my $e (@$diff){
            if ( $e->[0] eq 'u' ){
                $line1 .= ' ';
            }
            else{
                $line1 .= $e->[0];
                $count++;
            }

            $line2 .= $e->[2] || ' ';
        }

        print "$_\t${base}\t$count\n";
}
        }