Используйте это:
awk -F, 'BEGIN{OFS=","} NR>1{$2=$2".1"}1' file
-F,
задает разделитель полей ввода BEGIN{OFS=","}
задает разделитель полей вывода NR>1{$2=$2".1"}
добавляет .1
, если номер строки больше 0, ко второму полю Я думаю, было бы проще начать с циклического просмотра вложений и извлечь получателя по пути, так как оболочка расширит глобус в Алфавитный порядок. Ваш скрипт может выглядеть так:
#!/usr/bin/env sh
line=1
for i in *.pdf
do
echo "$i"
recipient="$(awk -v line="$line" 'NR==line' emailADD.txt)"
if [ -n "$recipient" ]
then
printf "recipient: %s\n" "$recipient"
line=$((line+1))
printf '%s\n' 'Hello, world!' | echo mail -s 'This is the email subject' -a "$i" "$recipient"
fi
done
Удалите echo
, чтобы фактически запустить команду mail
, но сначала запустите ее вместе с ней. чтобы убедиться, что он будет делать то, что вам нужно.
Если вы собираетесь отправлять кучу электронных писем, вы можете повысить производительность, избегая открытия файла emailADD.txt один раз для каждого вложения. Если вы используете bash, вы можете использовать <()
для обработки вложений без сохранения их имен в файле:
$ paste emailADD.txt <(ls folder/) | while read -r email pdf; do printf '%s\n' 'Hello, world!' | echo mail -s 'This is the email subject' -a "$pdf" "$email"; done
Вы можете удалить echo
, как только вам покажется, что он будет делать то, что вы хотите.
Однако, если вы не будете запускать это в автоматическом/обычном режиме, рассмотрите возможность создания текста полных команд (, включая printf ), перенаправление вывода в файл, а затем выполнение команд в этом файле. Это позволяет проверить команды, избежать неожиданностей, если emailADD.txt или список вложений изменится во время -выполнения, и дает вам отчет о том, что было сделано (, который можно сохранить или удалить ). Вот так:
$ paste emailADD.txt <(ls folder/) | while read -r email pdf; do echo "printf '%s\n' 'Hello, world' | mail -s 'This is the email subject' -a '$pdf' '$email' " ; done >| cmds