Bash новичок здесь. Я пытаюсь понять, как читать части электронной почты в файлах CSV, чтобы использовать их для отправки им по электронной почте других элементов CSV. Например (см. Образец CSV ниже), мне нужно будет отправить email1@domain.com его заказ картофеля фри и бургера.

Email,orders,Status
email1@domain.com,fries,fulfilled
email1@domain.com,burger,fulfilled
email1@domain.com,soda,Not fulfilled
email2@domain.com,soda,fulfilled
email2@domain.com,burger,Not fulfilled
email2@domain.com,fries,fulfilled
email3@domain.com,soda,fulfilled
email3@domain.com,burger,fulfilled
email4@domain.com,fries,Not fulfilled
email5@domain.com,soda,Not fulfilled
email5@domain.com,fries,fulfilled
email5@domain.com,burger,fulfilled

Я немного не понимаю, с чего начать. У меня есть это:

cat "result.csv" | while IFS=',' read -r line; do
  email="$(echo "$line" | cut -d ',' -f 1)"
  order="$(echo "$line" | cut -d ',' -f 2)"
done

Но я не мог понять, как продвинуть 1 строку, чтобы увидеть, нужно ли мне включать заказ из следующей строки (если адрес электронной почты совпадает с тем, что сейчас читает скрипт). Решения Bash и python приветствуются :-)

0
prokopio_kuba 25 Сен 2018 в 18:38

2 ответа

Лучший ответ

Я думаю, что вы ищете код для накопления порядка по строкам. Задача посложнее. Предполагая, что вы используете bash версии 4 или выше, это сработает. Если вы используете bash версии 3, последний адрес электронной почты будет пустым. На самом деле я использую версию 3 bash (аргумент - отстой, Apple), так что надеюсь, что понял. Последнюю строку я заполнил вручную.

#!/bin/bash

previous_email=""

full_order=""

IFS=,
(while  read -r current_email order status; do
        # echo $current_email $order $status
        if [[ "$current_email" == 'Email' ]] ; then
            previous_email="Email"
        else
            if [[ $current_email != $previous_email  ]] ; then
                # Destination email changed

                if [[ $previous_email == "Email"  ]] ; then
                    # Nothing to print from header line 
                        previous_email=$current_email
                if [[ "$status" == "fulfilled" ]]; then
                                    full_order=$order
                            else
                                    full_order=""
                    fi
                else
                    # Do summary

                    if [[ $full_order == "" ]] ; then
                            printf "$previous_email  - You have no orders\n"
                    else    
                            printf "$previous_email  - Your order is $full_order\n  "
                    fi

                    previous_email=$current_email

                if [[ "$status" == "fulfilled" ]]; then
                                    full_order=$order
                            else
                                    full_order=""
                    fi
                fi  

            else  # continue with same email
            if [[ "$status" == "fulfilled" ]]; then
                        if [[ $full_order == "" ]] ; then
                                full_order=$order
                        else
                                full_order="$full_order, $order"
                        fi
                fi
        fi
fi
done < result.csv

printf "$current_email your order is $full_order\n" )


sh prog.sh
email1@domain.com  - Your order is fries, burger
email2@domain.com  - Your order is soda, fries
email3@domain.com  - Your order is soda, burger
email4@domain.com  - You have no orders
email5@domain.com  your order is fries, burger
0
Leonard 25 Сен 2018 в 21:56

Ваша команда read разделит строку, если вы укажете достаточно имен для присвоения.

while IFS=, read -r email order status; do
  if [ "$status" != fulfilled ]; then
    echo "$email ordered $order, but still awaiting delivery"
  else
    echo "$email received their $order"
  fi
done < result.csv

В общем, bash может обрабатывать только такие простые CSV-файлы, как этот, без кавычек. Вместо bash рекомендуется использовать язык с соответствующей библиотекой синтаксического анализа CSV.

2
chepner 25 Сен 2018 в 16:14