2

ファイルmonday.csv

223.22;1256.4
227.08;1244.8
228.08;1244.7
229.13;1255.0
227.89;1243.2
224.77;1277.8

ファイルtuesday.csv

227.02;1266.3
227.09;1234.9
225.18;1244.7
224.13;1255.3
228.59;1263.2
224.70;1247.6

このPerlワンライナーは、最初の列の最初の3桁がファイル「monday.csv」の227または226である行の2番目の列の値が最も高い行を提供します。

perl -F\; -ane '$hash{$_} = $F[1] if /22[78]/; END{ print and exit for sort{ $hash{$b} <=> $hash{$a} } keys %hash }' monday.csv

このPerlワンライナーは、最初の列の最初の3桁がすべての* day.csvファイルの227または226である行の、2番目の列の値が最も高い行を提供します。

perl -F\; -ane '$hash{$_} = $F[1] if /22[78]/; END{ print and exit for sort{ $hash{$b} <=> $hash{$a} } keys %hash }' *day.csv

このワンライナーを書き直して、次のような出力を取得するにはどうすればよいですか?

filename:"最初の列の最初の3桁がファイル'filename.csv'の227または226である行の2番目の列の値が最も高い行"

*day.csvファイルごとに?

4

3 に答える 3

5

$ARGV現在のファイル名に使用できます。最大値のみに関心がある場合は、すべての値を保存してから並べ替える必要はありません。代わりに、各ファイルの最大値を保存するだけです。また、正規表現はおそらく行の先頭に固定する必要があります。

# Line breaks added for display purposes.
perl -F\; -ane '
    $max{$ARGV} = $F[1] if /^22[78]/ and $F[1] > $max{$ARGV};
    END{ print "$_\t$max{$_}" for sort keys %max}
' *day.csv

または、最大値が発生する行全体を保存する場合は、次のようにします。

perl -F\; -ane '
    ($max{$ARGV}{ln}, $max{$ARGV}{mx}) = ($_, $F[1])
        if /^22[78]/ and $F[1] > $max{$ARGV}{mx};
    END{ print "$_\t$max{$_}{ln}" for sort keys %max}
' *day.csv
于 2010-10-16T10:12:52.723 に答える
2

ファイル名は$ARGV変数に含まれています:

$ ARGV

<>から読み取るときの現在のファイルの名前が含まれます。


ただし、提示されたワンライナーには問題があります。最初の列の値を繰り返した場合はどうなりますか?

より良いワンライナーは次のようになります。

$ perl -F/;/ -MList::Util=max -lane 'push @{ $wanted{$ARGV} }, $F[1] if $F[0] =~ /22[78]/; } END { print "$ARGV : ", max(@{ $wanted{$_} }) for keys %wanted;' *.csv

コメントに基づく:

$ perl -F/;/ -lane '$wanted{$ARGV} = \@F if $F[1] >= $wanted->{$ARGV}[1] && $F[0] =~ /22[78]/; } END { print "$_ : @$wanted{$_}" for keys %wanted;' *.csv
于 2010-10-16T10:04:38.157 に答える
-1

$ARGVが使えるようです。

于 2010-10-16T09:59:28.520 に答える