Большинство реализаций cron не запускают оболочку с процессом в ней, но вы запускаете оболочку для разбора конвейера и запуска двух процессов по отдельности. Если вы добавите свои команды в script.sh и вызовете его из cron, он будет работать.
В оболочке zsh
при условии, что эти файлы находятся в текущем каталоге:
$ ls
20210507_5678_abc.txt 20210602_1234_abc.txt 20210603_1234_def.txt 20210607_5678_def.txt
$ typeset -A h; for f (*_*_*.txt) h[${${(s[_])f}[2]}]=$f; print -rC1 - $h
20210603_1234_def.txt
20210607_5678_def.txt
Где
*_*_*.txt
будет отсортировано лексически, а также в хронологическом порядке. ${(s[_])f}
разделяет $f
на_
${...[2]}
берет второе поле, полученное в результате этого расщепления h[that]=$f
:в этом цикле элементу этого ассоциативного массиваh
A
для клавиши that
присваивается полное имя файла. Из-за сортировки в конце вы получите тот, у которого самая поздняя дата для данногоthat
print -rC1 -- $h
:print
s значения хэша r
aw в столбце 1
C
. Если вы пишете сценарий, вы, вероятно, захотите его немного разбить, чтобы повысить разборчивость:
typeset -A max
for file in *_*_*.txt(N); do
parts=( ${(s[_]file} )
max[$parts[2]]=$file
done
print -rC1 -- $max
(здесь также добавлен квалификаторN
(nullglob )glob, чтобы избежать ошибки, если этот glob не соответствует ни одному файлу ).
Используя awk
и предполагая, что ввод осуществляется из текстового файла (, это никогда не указывается в вопросе):
$ awk -F '_' 'max[$2] < $1 { max[$2] = $1; maxline[$2] = $0 } END { for (i in maxline) print maxline[i] }' file
20210607_5678_def.txt
20210603_1234_def.txt
При этом каждая строка ввода рассматривается как набор_
-полей с разделителями. Массив max
отслеживает максимальное значение из 1-го поля с учетом ключа из 2-го поля, а maxline[i]
— это полная строка, соответствующая максимальному значению в max[i]
.
Когда обнаруживается новое максимальное значение для некоторого ключа, значения max
и maxline
для этого ключа обновляются. В конце выводятся все строки из maxline
.
Использованиеsort
:
$ sort -t _ -k 1,1nr file | sort -s -u -t _ -k 2,2
20210603_1234_def.txt
20210607_5678_def.txt
Первый sort
упорядочивает весь файл по первому_
-полю с разделителями в обратном числовом порядке. Второй sort
сортирует по второму полю и сохраняет только первую строку для любого значения этого поля. Параметр -u
для sort
заставляет утилиту отбрасывать строки с уже просмотренными ключами сортировки, а -s
обеспечивает использование стабильного алгоритма сортировки (, т.е. что строки с одинаковыми ключами не пере -упорядочены ).