$ 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
будет иметь тот же индекс, владельца, группу и разрешения, что и раньше.
Поскольку мы ищем только максимальное значение, нам не нужно сортировать, просто просмотрите файл:
awk -F "=" '
$NF > max {max = $NF}
END {print max}
' ansh.log
Если любишь один -лайнер
awk -F= '$NF > max {max = $NF} END {print max}' ansh.log
Так как @glennjackman уже покрыл awk-скрипт, вот альтернатива, которая на самом деле довольно краткая и эффективная, предполагающая, что у вас всегда есть 4 =
в каждой строке, как показано в вашем примере ввода:
$ cut -d'=' -f5 file | sort -rn | head -1
64987201
Если у вас есть переменные номера =
, вы всегда можете заменить эту команду cut
на awk -F'=' '{print $NF}'
.
Использование 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... >
нулевой -ширины Раку. Требуется?
(положительная)match
after
экранированная строка memory\=
. Весь просмотр назад выглядит следующим образом:<?after memory\= >
. В END
построчных операций max
значений в @a
печатаютсяput
(-с использованием терминатора -).
Существуют более простые способы кодирования этого решения, такие как сравнение каждого значения с предыдущим значением и сохранение max
в каждом случае. Однако это решение имеет то преимущество, что все значения memory
извлекаются и сохраняются в @a
для последующего использования, например, для статистического анализа (, например. значит ).
Вот еще один ответ, похожий на ответ Эда Мортона, но для этого не требуется фиксированное количество=
:
grep -oh "memory.[0-9,=]*" file | cut -d'=' -f2 | sort -rn | head -1