Как получить максимальное значение из журналов

$ awk -v i=1 '/ \.mp3/ {sub(/ \.mp3/," "i++".mp3",$0)};1' input.txt
line 1
wget 1.mp3 url
line 2
wget 2.mp3

Если цифры в URL-адресе wget должны быть дополнены нулями -, вы можете использовать sprintf()awk для форматирования iс ведущими нулями.Например:

$ awk -v i=1 '/ \.mp3/ {sub(/ \.mp3/," "sprintf("%03i",i++)".mp3",$0)};1' input.txt
line 1
wget 001.mp3 url
line 2
wget 002.mp3

Вы также можете комбинировать sprintf()с опцией wget-O(--output-document)для сохранения загруженных файлов с нулевыми -дополненными именами файлов, чтобы они правильно сортировались (, например. 01,02,03,...10 вместо 1,10,2,3,...)

$ awk -v i=1 '/ \.mp3/ {sub(/ \.mp3/," "i".mp3 -O "sprintf("%03i",i++)".mp3",$0)};1' input.txt
line 1
wget 1.mp3 -O 001.mp3 url
line 2
wget 2.mp3 -O 002.mp3

Все вышеперечисленные лайнеры -будут выводиться на стандартный вывод. Чтобы перезаписать оригинал, перенаправьте его на новый файл и либо mvего, либо перезапишите оригинал.

awk -v i=1 '/ \.mp3/ {sub(/ \.mp3/," "i++".mp3",$0)};1' orig.txt > new.txt

и либо:

mv new.txt orig.txt

Это заменит orig.txtновым файлом, созданным с разрешениями, указанными текущим значением umask. У него также может быть новый владелец и/или группа (в зависимости от того, кто его запускает и какая у них группа по умолчанию ). У него также будет новый номер инода, который разорвет любые жесткие ссылки -, которые могут существовать.

Большинство программ, у которых есть опция «в -место редактирования» (, например. sed -iилиperl -i)сделайте это. В большинстве случаев это нормально, потому что он запускается тем же пользователем с тем же umask, что и у владельца исходного файла, и лишь немногие файлы имеют несколько жестких ссылок.

или

cat new.txt > orig.txt
rm new.txt

Это перезапишет содержимое orig.txtсодержимым new.txt, а затем удалит new.txt. orig.txtбудет иметь тот же индекс, владельца, группу и разрешения, что и раньше.

3
17.11.2021, 19:01
4 ответа

Поскольку мы ищем только максимальное значение, нам не нужно сортировать, просто просмотрите файл:

awk -F "=" '
    $NF > max {max = $NF}
    END {print max}
' ansh.log

Если любишь один -лайнер

awk -F= '$NF > max {max = $NF} END {print max}' ansh.log
5
17.11.2021, 20:34

Так как @glennjackman уже покрыл awk-скрипт, вот альтернатива, которая на самом деле довольно краткая и эффективная, предполагающая, что у вас всегда есть 4 =в каждой строке, как показано в вашем примере ввода:

$ cut -d'=' -f5 file | sort -rn | head -1
64987201

Если у вас есть переменные номера =, вы всегда можете заменить эту команду cutна awk -F'=' '{print $NF}'.

3
18.11.2021, 01:22

Использование Raku (, ранее известного как Perl _6)

raku -ne 'state @a.push(.match: /<?after memory\= > <digit>+ $/ ); END put @a.max;'

Пример ввода:

Timestamp, xyz=1, abc=2, def=6, memory=64357890
Timestamp, xyz=1, abc=2, def=6, memory=64987201

Пример вывода:

64987201

Приведенное выше решение закодировано на Raku, члене семейства языков программирования Perl -.

Вкратце, rakuзапускается в командной строке с-ne(построчно, без -флагов автопечати ). Массив @aравенstate-d и сразу же содержит значенияpush-ed на нем. Значения push-, заданные для него, составляют на одну -или -больше<digit>+-с, захваченных в операции match. Операция matchиспользует конструкцию положительного просмотра назад <?after... >нулевой -ширины Раку. Требуется?(положительная)matchafterэкранированная строка memory\=. Весь просмотр назад выглядит следующим образом:<?after memory\= >. В ENDпострочных операций maxзначений в @aпечатаютсяput(-с использованием терминатора -).

Существуют более простые способы кодирования этого решения, такие как сравнение каждого значения с предыдущим значением и сохранение maxв каждом случае. Однако это решение имеет то преимущество, что все значения memoryизвлекаются и сохраняются в @aдля последующего использования, например, для статистического анализа (, например. значит ).

https://raku.org

1
18.11.2021, 10:31

Вот еще один ответ, похожий на ответ Эда Мортона, но для этого не требуется фиксированное количество=:

grep -oh "memory.[0-9,=]*" file | cut -d'=' -f2 | sort -rn | head -1
0
18.11.2021, 11:56

Теги

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