Как использовать функцию group by и max в сценарии оболочки unix

Большинство реализаций cron не запускают оболочку с процессом в ней, но вы запускаете оболочку для разбора конвейера и запуска двух процессов по отдельности. Если вы добавите свои команды в script.sh и вызовете его из cron, он будет работать.

1
20.06.2021, 12:16
2 ответа

В оболочке 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:в этом цикле элементу этого ассоциативного массиваhAдля клавиши thatприсваивается полное имя файла. Из-за сортировки в конце вы получите тот, у которого самая поздняя дата для данногоthat
  • print -rC1 -- $h:prints значения хэша raw в столбце 1C.

Если вы пишете сценарий, вы, вероятно, захотите его немного разбить, чтобы повысить разборчивость:

typeset -A max

for file in *_*_*.txt(N); do
  parts=( ${(s[_]file} )
  max[$parts[2]]=$file
done

print -rC1 -- $max

(здесь также добавлен квалификаторN(nullglob )glob, чтобы избежать ошибки, если этот glob не соответствует ни одному файлу ).

4
28.07.2021, 11:23

Используя 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обеспечивает использование стабильного алгоритма сортировки (, т.е. что строки с одинаковыми ключами не пере -упорядочены ).

0
28.07.2021, 11:23

Теги

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