Повторяющиеся значения в столбце - PullRequest
0 голосов
/ 31 мая 2018

У меня есть оригинальный файл, который имеет следующие столбцы,

02-May-2018,AAPL,Sell,0.25,1000
02-May-2018,C,Sell,0.25,2000
02-May-2018,JPM,Sell,0.25,3000
02-May-2018,WFC,Sell,0.25,5000
02-May-2018,AAPL,Sell,0.25,7000
02-May-2018,GOOG,Sell,0.25,8000
02-May-2018,GOOG,Sell,0.25,9000
02-May-2018,C,Sell,0.25,2000
02-May-2018,AAPL,Sell,0.25,3000

Я пытаюсь напечатать эту исходную строку, если я вижу значение во втором столбце более чем 2 раза .. например, если я вижуAAPL более чем в 2 раза должен получить желаемый результат:

02-May-2018,AAPL,Sell,0.25,1000
02-May-2018,AAPL,Sell,0.25,7000
02-May-2018,AAPL,Sell,0.25,3000

Итак, я написал следующее, которое печатает результаты несколько раз, что неверно. Не могли бы вы помочь мне в том, что я делаю неправильно?

open (FILE, "<$TMPFILE") or die "Could not open $TMPFILE";
open (OUT, ">$TMPFILE1") or die "Could not open $TMPFILE1";
%count = ();
@symbol = ();
while ($line = <FILE>)
{
        chomp $line;
        (@data) = split(/,/,$line);
         $count{$data[1]}++;
        @keys = sort {$count{$a} cmp $count{$b}} keys %count;
        for my $key (@keys)
        {
        if ( $count{$key} > 2 )
        {
            print "$line\n";
        }
     }
}

Ответы [ 4 ]

0 голосов
/ 03 июня 2018

Простой ответ:

push @{ $lines{(split",")[1]} }, $_ while <>;
print @{ $lines{$_} } for grep @{ $lines{$_} } > 2, sort keys %lines;

perl program.pl inputfile > outputfile
0 голосов
/ 31 мая 2018

Я бы сделал это примерно так - сохраните строки, которые вы видели, в «буфере» и напечатайте их снова, если условие выполнено (перед продолжением печати по ходу):

#!/usr/bin/env perl

use strict;
use warnings;

my %buffer; 
my %count_of;

while ( my $line = <> ) {  
   my ( $date, $ticker, @values ) = split /,/, $line; 
   #increment the count
   $count_of{$ticker}++;

   if ( $count_of{$ticker} < 3 ) { 
       #count limit not hit, so stash the current line in the buffer. 
       $buffer{$ticker} .= $line; 
       next;
   }
   #print the buffer if the count has been hit
   if ( $count_of{$ticker} == 3 ) {
       print $buffer{$ticker};
   }
   #only gets to here once the limit is hit, so just print normally.
   print $line;
}

С вашими входными данными это выводит:

02-May-2018,AAPL,Sell,0.25,1000
02-May-2018,AAPL,Sell,0.25,7000
02-May-2018,AAPL,Sell,0.25,3000
0 голосов
/ 31 мая 2018

Это должно работать:

use strict;
use warnings;

open (FILE, "<$TMPFILE") or die "Could not open $TMPFILE";
open (OUT, ">$TMPFILE1") or die "Could not open $TMPFILE1";

my %data;
while ( my $line = <FILE> ) {
    chomp $line;
    my @line = split /,/, $line;
    push(@{$data{$line[1]}}, $line); 
}

foreach my $key (keys %data) {
    if(@{$data{$key}} > 2) {
        print "$_\n" foreach  @{$data{$key}};
    }
}
0 голосов
/ 31 мая 2018

Вам необходимо прочитать входной файл дважды, потому что вы не знаете окончательных результатов, пока не доберетесь до конца файла

use strict;
use warnings 'all';

my ($TMPFILE, $TMPFILE1) = qw/ infile outfile /;

my %counts;

{
    open my $fh, '<', $TMPFILE or die "Could not open $TMPFILE: $!";

    while ( <$fh> ) {
        my @fields = split /,/;
        ++$counts{$fields[1]};
    }
}

open my $fh, '<', $TMPFILE or die "Could not open $TMPFILE: $!";
open my $out_fh, '>', $TMPFILE1 or die "Could not open $TMPFILE1: $!";

while ( <$fh> ) {
        my @fields = split /,/;
        print $out_fh $_ if $counts{$fields[1]} > 2;
}

output

02-May-2018,AAPL,Sell,0.25,1000
02-May-2018,AAPL,Sell,0.25,7000
02-May-2018,AAPL,Sell,0.25,3000
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...