Как получить имя входного файла в однострочном Perl? - PullRequest
2 голосов
/ 16 октября 2010

cat 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

cat 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 цифры - 227 или 226 из файла "monday.csv ":

$ 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 цифры227 или 226 из всех файлов * day.csv:

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

Как можно переписать этот однострочный файл, чтобы получить вывод:

имя файла:msgstr "строка с наибольшим значением во втором столбце из строк, где в первом столбце первые 3 цифры - 227 или 226 от имени файла в файле.csv '"

для каждого *day.csv файла?

Ответы [ 4 ]

5 голосов
/ 16 октября 2010

Вы можете использовать $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
2 голосов
/ 16 октября 2010

Имя файла содержится в переменной $ARGV:

$ ARGV

содержит имя текущего файлапри чтении из <>.


Однако представленные однострочники имеют проблему;Что делать, если вы повторили значения вашего первого столбца?

Лучше бы, если бы одна строчка была:

0 голосов
/ 16 октября 2010

Если бы я хотел получить всю строку, я мог бы сделать это (основываясь на ответе FM):

perl -F\; -ane '$max{$ARGV} = $_ if /^22[78]/ and $F[1] >= (split /;/, $max{$ARGV})[1];  END{ print "$_\t$max{$_}" for sort keys %max}' *day.csv

Я нашел более короткое решение.
все файлы:

perl -F\; -anE '$max{$ARGV} = [@F] if /^22[78]/ and $F[1] >= $max{$ARGV}->[1];  END{ print "$_\t@{$max{$_}}" for sort keys %max}' *day.csv

один файл:

perl -F\; -anE '$max = [@F] if /^22[78]/ and $F[1] >= $max->[1]; END{ print "@$max" }' monday.csv

или если свободного места мало

perl -F\; -anE'$m{$ARGV}=[@F]if/^22[78]/&&$F[1]>=$$m{$ARGV}[1]}print"$_\t@{$m{$_}}"for sort keys%m;{' *day.csv

perl -F\; -anE'$m=[@F]if/^22[78]/&&$F[1]>=$$m[1]}print"@$m";{' monday.csv

Как показал Заид: чтобы получить последнюю строку с наибольшим значением в случае повторяющихся наивысших значений в файле, я изменил "$ F [1]> $ max ..." - часть на "$ F [1] > = $ max ".

0 голосов
/ 16 октября 2010

Кажется, что вы можете использовать $ ARGV. Смотрите " текущее имя файла "

...