Введение
EARLY CRUMB нужен список, которым упаковщик сможет пользоваться в субботу. Оплаченный заказ может быть отменён, а один действующий заказ — требовать нескольких разных товаров. Ваша задача — сохранить нужные заказы и все количества, затем передать отдельные этикетки для пакетов.
Эта новая независимая работа предоставляет все исходные записи и отсортированный файл ID оплаченных заказов. Файлы из предыдущей виртуальной машины не нужны. Достаточно базового знакомства с терминалом: необходимые команды выборки, сортировки и соединения объясняются по ходу работы. Приложение или универсальный скрипт писать не придётся.
Используйте Workstation для файлов и Pickup Preview для чтения записей, открытия фактического списка, просмотра этикеток и скачивания результата. Предпросмотр только читает ваш файл: он не исключает отмены и не исправляет количества.
Исключите отменённые заказы
На этом шаге вы создадите множество ID оплаченных и неотменённых заказов. Начните в Pickup Preview.
Начните с реального решения об упаковке
Откройте Sample label, чтобы увидеть, как ID заказа, покупатель и количество товара превращаются в удобную этикетку пакета. Затем откройте Records. P101 принадлежит Alex: нужны два ржаных хлеба и одно овсяное печенье. P102 тоже принадлежит Alex, но не оплачен. P103 оплачен и присутствует в cancellations.tsv. Пакет для него готовить нельзя.
Платежи и отмены отвечают на разные вопросы. Для этой выдачи подходит только заказ с точным статусом paid, ID которого отсутствует в отменах.

Изучите независимую рабочую среду
Переключитесь в Workstation. pwd выводит текущий каталог, а cat — содержимое файла:
pwd
/home/labex/project/pickup
cat paid-order-ids.txt
P101
P103
P104
P105
Этот отсортированный файл предоставлен в данной работе. Он содержит ID с точным статусом paid, включая P103. Прочитайте второй вход для решения:
cat source/cancellations.tsv
order_id
P103
source/ остаётся неизменным. Файлы в work/ и итоговый pickup-list.tsv можно пересоздавать. Если сменили каталог, cd /home/labex/project/pickup вернёт вас сюда.
Сравните два отсортированных множества
Множество здесь — список различных ID. comm сравнивает два отсортированных файла. В первом столбце находятся ID только первого входа, во втором — только второго, в третьем — общие. -23 скрывает столбцы 2 и 3, оставляя ID первого входа, которых нет во втором. Именно это и нужно: оплаченные ID минус отменённые.
LC_ALL=C обеспечивает согласованную сортировку и сравнение в этом терминале. tail -n +2 удаляет заголовок; sort -u сортирует и удаляет одинаковые строки ID. Канал передаёт вывод следующей команде. > сохраняет его в отдельный рабочий файл, заменяя при повторе; никогда не используйте путь входа как путь вывода.
export LC_ALL=C
sort -u paid-order-ids.txt > work/paid.sorted.txt
tail -n +2 source/cancellations.tsv | sort -u > work/cancelled-order-ids.txt
comm -23 work/paid.sorted.txt work/cancelled-order-ids.txt > work/eligible-order-ids.txt
cat work/eligible-order-ids.txt
P101
P104
P105
P103 удалён, остальные оплаченные заказы остались. Если появится предупреждение о сортировке входов, пересоздайте оба входных множества с указанной настройкой. Не удаляйте заказы из источников и не считайте отсутствие платежа разрешением на упаковку.
Создайте список товаров и откройте настоящие этикетки
На этом шаге вы сохраните каждый товар и его количество для подходящих ID, а затем воспользуетесь реальным результатом. Начните в Workstation.
Соедините ID со всеми товарными строками
В orders.tsv ID заказа может встречаться в нескольких строках. Для P101 нужны и rye, и oat. Три подходящих ID не означают три штуки хлеба. Сохраните каждую исходную товарную строку и её количество.
Прочитайте таблицу:
cat source/orders.tsv
Четыре поля — order_id, customer, item, quantity — разделены табуляцией. Первая строка — заголовок. tail -n +2 удаляет только его. TAB=$(printf '\t') сохраняет табуляцию в переменной оболочки. -t "$TAB" указывает sort и join использовать её; двойные кавычки сохраняют один аргумент. sort -k1,1 -k3,3 сортирует по ID заказа, затем по коду товара, сохраняя все четыре поля. Не заменяйте таблицу товаров результатом sort -u, применённого только к полю ID.
TAB=$(printf '\t')
tail -n +2 source/orders.tsv > work/orders.rows
sort -t "$TAB" -k1,1 -k3,3 work/orders.rows > work/orders.sorted.tsv
join сопоставляет первые поля отсортированных входов. Первый содержит подходящие ID, второй — все товарные строки. Здесь полезно стандартное поведение, оставляющее только совпадения: сохраняются только подходящие заказы, но выводятся все их товарные строки. ID появляется один раз, затем имя покупателя, товар и количество.
join -t "$TAB" work/eligible-order-ids.txt work/orders.sorted.tsv > work/pickup.rows
cat work/pickup.rows
P101 Alex oat 1
P101 Alex rye 2
P104 Noor oat 2
P105 Jules oat 1
P105 Jules rye 1
Промежутки выше — табуляции. Получилось пять товарных строк для трёх заказов. До передачи файла проверьте два разных товара P101 и их количества.
Задайте понятный получателю формат
Для чтения нужен тот же заголовок из четырёх полей. printf понимает \t как табуляцию, а \n как перевод строки. > начинает новый файл назначения, >> дописывает строки, не стирая заголовок. Повторение этих двух команд полностью заменит предыдущий результат, не добавляя дубликатов.
printf 'order_id\tcustomer\titem\tquantity\n' > pickup-list.tsv
cat work/pickup.rows >> pickup-list.tsv
cat pickup-list.tsv
Используйте результат, а не только сумму
Переключитесь в Pickup Preview и откройте Pickup list. Если страница уже открыта, обновите её. Вы должны увидеть 3 collection bags · 5 item lines · 7 pieces. Эти числа помогают заметить ошибку, но не доказывают, что каждому досталось правильное содержимое.
Откройте этикетку P101 для Alex: должны быть Oat cookie 1 и Rye loaf 2. Перейдите по All collection bags, откройте P104 и проверьте Oat cookie 2 для Noor; P105 даёт Jules Oat cookie 1 и Rye loaf 1. Для P102, P103 и P106 пакетов быть не должно. Одних имён недостаточно для установления этих связей.
Нажмите Print label, чтобы открыть окно печати, если браузер это поддерживает; после просмотра отмените печать. Физический принтер не нужен. Вернитесь к списку и выберите Download the actual list. Вы получите созданный вами TSV, а не заранее рассчитанный эталон.
Если предпросмотр сообщает об ошибке формата, проверьте заголовок и табуляцию в Workstation, пересоздайте файл и обновите страницу. Если неверны количества, сравните work/pickup.rows с исходными заказами. Интерфейс не исправляет работу незаметно.
Добавьте поздний заказ без дублирования прежних пакетов
На этом шаге вы пересоздадите результат по полному обновлённому снимку входных данных. Начните в Workstation, сохранив прежние настройки оболочки.
Разберитесь в новых данных
Исходные файлы в source/ не изменяются. source/late/ содержит полный более поздний снимок всех трёх таблиц, а не несколько строк для добавления к результату. Новый оплаченный заказ P107 принадлежит Aya: нужны два овсяных печенья. Прежняя отмена всё ещё действует.
cat source/late/orders.tsv
cat source/late/payments.tsv
Предоставленный paid-order-ids.txt описывает первоначальный снимок. Чтобы включить новый заказ, вычислите новое множество оплаченных ID из более поздней таблицы платежей. grep $'\tpaid$' выбирает табуляцию и точный статус в конце строки, исключая unpaid; cut -f1 оставляет ID заказа. sort -u готовит множество ID к сравнению. Сохраните LC_ALL=C и TAB из предыдущих шагов; после переподключения восстановите их здесь.
export LC_ALL=C
TAB=$(printf '\t')
tail -n +2 source/late/payments.tsv | grep $'\tpaid$' | cut -f1 | sort -u > work/paid.sorted.txt
tail -n +2 source/late/cancellations.tsv | sort -u > work/cancelled-order-ids.txt
comm -23 work/paid.sorted.txt work/cancelled-order-ids.txt > work/eligible-order-ids.txt
Вы применили то же правило к новому полному снимку. Теперь пересоздайте вход с товарами и файл назначения:
tail -n +2 source/late/orders.tsv > work/orders.rows
sort -t "$TAB" -k1,1 -k3,3 work/orders.rows > work/orders.sorted.tsv
join -t "$TAB" work/eligible-order-ids.txt work/orders.sorted.tsv > work/pickup.rows
printf 'order_id\tcustomer\titem\tquantity\n' > pickup-list.tsv
cat work/pickup.rows >> pickup-list.tsv
cat pickup-list.tsv
Теперь должно быть шесть товарных строк: прежние пять и P107/Aya/oat/2. Заголовок встречается один раз. Пересоздание из полного снимка позволяет не добавлять все старые строки повторно.
Проверьте фактическую новую передачу
Переключитесь в Pickup Preview, откройте Pickup list и обновите страницу. Ожидается 4 collection bags · 6 item lines · 9 pieces. Откройте P107 и проверьте два овсяных печенья для Aya. Снова откройте P101 и убедитесь, что обе товарные строки по-прежнему верны. У отменённого P103 и неоплаченного P102 этикеток всё ещё нет.

Скачайте фактический список ещё раз и сравните его содержимое с обновлённой передачей. Страница Records намеренно сохраняет первоначальный снимок для контекста; поздние входы — прочитанные вами файлы в source/late/. Необновлённая страница не доказывает, что команды не сработали: перед сравнением обновите её.
Если итоги удвоились, вернитесь к двум командам записи назначения: > должен создать новый заголовок до того, как >> добавит текущие строки. Если P107 отсутствует, проверьте, что и платежи, и товары взяты из source/late/. Исправьте рабочие файлы и пересоздайте результат; не подменяйте реальные товарные строки ожидаемой суммой.
Резюме
Вы сравнили отсортированные множества ID, соединили подходящие заказы со всеми товарными строками и создали настоящий список выдачи с этикетками пакетов. Вы повторили процесс для полного более позднего снимка без дублирования прежних пакетов. Независимое задание о мастерских использует те же методы с другими связями допустимости и материалами.



