Строки извлечения от текстового файла с одним столбцом равняются максимуму

Вы не делаете ничего плохого. Пакет неправильно подписывается.

От потока на lists.rpmfusion.org:

Вы знаете о других пакетах, которые должны были бы быть оставлены, также? a52dec является всего одним примером.

После того как измененный пакет прибывает в зеркала, устанавливание его, скорее всего, будет хорошо работать (требование "конфетки чистые пакеты", однако, для чистки кэша пакета).

В то время как это было в отношении Fedora 16 пакетами, по всей вероятности - Ваш пакет также страдает от той же судьбы плохой подписи. Считайте остальных на lists.rpmfusion.org.

2
11.09.2013, 00:53
4 ответа

Один способ сделать его состоял бы в том, чтобы считать файл однажды для получения max и с другой стороны распечатать соответствующие строки:

max=$(awk 'NR>1 && $5>max {max=$5}; END{print max}' file.txt) && 
 awk -v max="$max" '$5==max' file.txt 

Или, более кратко:

awk -v m="$(awk '(NR>1 && $5>m){m=$5};END{print m}' file.txt)"  '$5==m' file.txt 

Прием здесь является awk's -v флаг, который позволяет Вам передавать переменную awk. В этом случае я сначала вычисляю макс. значение и затем даю его awk как переменная max.

2
27.01.2020, 21:57
  • 1
    ! Все они работают, я просто, приняли первый код, так как это было больше в соответствии с тем, что я попробовал так, я понимаю это лучше. Благодарите много всем!! спасибо –  user971102 10.09.2013, 17:29

Это - довольно типичная проблема, для которой идиоматическое awk решение, включающее два, передает по файлу, существует. В первичной обработке определите макс. значение для $5 и во втором, извлеките записи, которые содержат то макс. значение в $5. Вот быстрый пример.

awk 'NR == FNR && NR > 1{max = max < $5? $5: max; next}; $5 == max{print}' file.txt file.txt
1
27.01.2020, 21:57
  • 1
    ! Оба этих метода работают, я нахожу, что это немного трудно понимает, потому что я - новичок …, мне нелегко иметь смысл главным образом части в скобках (и почему Вы повторяете входной файл дважды?). Но это делает задание отлично... –  user971102 10.09.2013, 17:32
  • 2
    @user971102, уверенный. Так как terdon сделал отличную работу по даванию четкого объяснения, необходимо принять его ответ –  iruvar 10.09.2013, 17:43

Если бы использование памяти не является действительно проблемой, версия с одной передачей в жемчуге, вероятно, была бы:

perl -ane 'END { $"=""; print "@res"; } if($F[4] =~ /^\d+/ and $F[4] > $max) { 
    $max = $F[4]; @res = (); } push @res, $_ if($F[4] =~ /^\d+$/ and $max == $F[4]);' infile

-n говорит жемчугу обрабатывать infile одна строка во время, передавая каждую строку командам, указанным в -e. -a говорит жемчугу разворачивать каждую строку вокруг разделителя полей (это принимает значение по умолчанию для интервала), и присвойте это названному массиву @F. Результат для каждой строки, мы можем обработать его и использование $F[n] обращаться к энному элементу той строки.

Сам жемчуг:

END { $"=""; print "@res"; } # at the end of execution set the field separator to
                             # empty and print the contents of @res, which includes
                             # newlines when the matching rows were stored

if($F[4] =~ /^\d+/ and $F[4] > $max) {  # if the 5th element of the line is solely a
    $max = $F[4]; @res = ();            # number and it's greater than $max (which
}                                       # starts as undefined), set $max to this number
                                        # and empty the @res results array.

push @res, $_                                  # push this line to @res ...
     if($F[4] =~ /^\d+$/ and $max == $F[4]);   # IF the 5th element is solely a 
                                               # number and equal to $max

Логика - это $max запускается как неопределенный и @res пустой массив. В первый раз, когда мы находим число в столбце 5, мы храним это в $max и пустой @res. Это также имеет побочный эффект освобождения @res если мы находим новое максимальное значение в столбце 5 на следующих строках. Как отдельная проверка, если столбец 5 равен $max добавьте эту строку к @res (снабдите строки существующим максимальным значением). Повторитесь для всех строк, и затем END { } блок выполняется, который печатает содержание @res массив результатов без ведущего разделителя полей пространства обычно начался $".

Это могло также, вероятно, быть достигнуто в awk, но мой awk-fu не является настолько большим!

1
27.01.2020, 21:57

Отсортируйте файл со значениями в порядке убывания, затем распечатайте строки от вершины, пока значение не изменится.

sort -k 5n | awk 'NR==1 {max=$5} $5!=max {quit} {print}'
1
27.01.2020, 21:57

Теги

Похожие вопросы