Вы можете использовать awk для запуска новой сортировки для каждого блока:
% awk -v cmd="sort -k2,2" '$1 != prev {close(cmd); prev=$1} {print | cmd}' foo
C 1
C 2
A 1
A 2
B 1
B 2
$1 != prev {close(cmd); prev=$1}
-когда сохраненное значение отличается, у нас есть новый блок, поэтому мы закрываем все ранее начатыеsort
{print | "sort -k2,2"}'
направляет вывод в sort
, запуская его, если он еще не запущен (awk может отслеживать команды, которые он запускает)Запишите вывод вашего скрипта во временный файл, подсчитайте количество строк в этом файле и переместите файл под новым именем:
t=$(mktemp) && len=$("$HOME/script" | tee -- "$t" | wc -l) && mv -- "$t" "$HOME/targetfile-$len.csv"
Если вы не используете GNU wc
, вы можете получить пробельные символы в начале или конце значения в $len
. Затем вам нужно будет удалить их :
t=$(mktemp) && len=$("$HOME/script" | tee -- "$t" | wc -l) && mv -- "$t" "$HOME/targetfile-$(( len + 0 )).csv"
Здесь я запускаю "$HOME/script"
только один раз и сохраняю вывод во временный файл($t
)и в то же время (любезно предоставленный tee
для дублирования данных ), подсчитываю количество строк в выход. Затем временный файл перемещается на новое имя.
Я бы, вероятно, поместил это в отдельный скрипт и запланировал это, вместо того, чтобы запланировать весь этот список в моем crontab.
Скрипт может выглядеть так
#!/bin/sh
tmpfile=$(mktemp) &&
length=$("$HOME/script" | tee -- "$tmpfile" | wc -l) &&
mv -- "$tmpfile" "$HOME/targetfile-$(( length + 0 )).csv"