2012-08-01 37 views
0
#input data 
11000000,  1637,  -7.8737,  -20.15022 
11000001,  1634,  -710.377,  -20.150137 
11000002,  1639,  -709.87366, -20.150133 
11000003,  1631,  -7.1737,  -22.650156 
11000004,  1639,  709.87366, -20.150133 
11000005,  1630,  -710.6,  -22.650074 

我想此输出,将来自第二塔,其是相等的打印值,从第三塔它们是相等的,但具有相反的符号,并且还打印值打印从第四列中的值这是平等的。如何处理使用散列在Perl从文件数据

输出应该是这样的:

1639,   709.87366,  -20.150133 
+0

在这个例子中第三列有没有相反的符号,它只是失误第一列。 – dave 2012-08-01 11:50:07

回答

0

也许是这样的:

while (<DATA>) { 
    chomp; 
    @datas = split/,\s+/; 
    $k = sprintf "%s:%s:%s", $datas[1], abs $datas[2], $datas[3]; 
    print join(",\t", @datas[1..3]), "\n" if (++$hash{$k} > 1); 
} 

__DATA__ 
11000000,  1637,  -7.8737,  -20.15022 
11000001,  1634,  -710.377,  -20.150137 
11000002,  1639,  -709.87366, -20.150133 
11000003,  1631,  -7.1737,  -22.650156 
11000004,  1639,  709.87366, -20.150133 
11000005,  1630,  -710.6,  -22.650074 
3

你可以简单地逐行读取文件中的行,然后

@numbers = split /\s+/, $line; 

# includes comma in the split pattern to select just the number 
@numbers = split /,\s+/, $line; 

,并选择

$numbers[1], $numbers[2], $numbers[3] 

一个简单的脚本whichi打印出你的要求,这可能是:

#!/usr/bin/perl -w 

use strict; 

open FILE, '<', 'input.txt'; 

foreach my $line (<FILE>) 
{ 
    my @numbers = split /,\s+/, $line; 
    printf "%d,\t%f,\t%f\n", $numbers[1], -1*$numbers[2], $numbers[3]; 
} 

close FILE; 
+0

'(split/\ s + /,$ line)[1..3]'在一行中); – gaussblurinc 2012-08-01 12:00:53