Перенаправление и количество строк в имени файла

Вы можете использовать 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 может отслеживать команды, которые он запускает)
0
27.08.2021, 18:25
1 ответ

Запишите вывод вашего скрипта во временный файл, подсчитайте количество строк в этом файле и переместите файл под новым именем:

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"
1
27.08.2021, 21:41

Теги

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