Introdução
A EARLY CRUMB precisa de uma lista que a pessoa responsável por embalar os pedidos de sábado consiga usar. Um pedido pago pode ser cancelado, e um pedido válido pode precisar de vários produtos diferentes. Sua tarefa é manter os pedidos certos e todas as quantidades e, então, entregar etiquetas individuais para as sacolas.
Este laboratório independente fornece todos os registros originais e um arquivo ordenado de IDs de pedidos pagos. Ele não depende de arquivos de uma VM anterior. Basta ter familiaridade básica com o terminal; os comandos necessários de seleção, ordenação e junção são explicados durante o uso. Você não escreverá uma aplicação nem um script de uso geral.
Use Workstation para trabalhar nos arquivos e Pickup Preview para ler registros, abrir a lista real, ver etiquetas e baixar sua entrega. A visualização apenas lê seu arquivo; não remove cancelamentos nem corrige quantidades.
Exclua pedidos cancelados
Nesta etapa, você criará o conjunto de IDs de pedidos pagos e não cancelados. Comece em Pickup Preview.
Comece pela decisão real de embalagem
Abra Sample label para ver como um ID de pedido, um cliente e uma quantidade de produto formam uma etiqueta útil para a sacola. Depois, abra Records. P101 pertence a Alex e precisa de dois pães de centeio e um biscoito de aveia. P102 também pertence a Alex, mas não foi pago. P103 está pago e aparece em cancellations.tsv. Ele não deve receber uma sacola.
Pagamentos e cancelamentos respondem a perguntas diferentes. Para esta retirada, um pedido só é elegível se seu status exato for paid e seu ID não constar nos cancelamentos.

Inspecione o ambiente independente
Mude para Workstation. pwd mostra o diretório atual. cat mostra um arquivo:
pwd
/home/labex/project/pickup
cat paid-order-ids.txt
P101
P103
P104
P105
Esse arquivo ordenado é fornecido neste laboratório. Ele contém os IDs cujo status de pagamento é exatamente paid, incluindo P103. Leia a outra entrada da decisão:
cat source/cancellations.tsv
order_id
P103
source/ permanece intacto. Você pode recriar os arquivos em work/ e o resultado final pickup-list.tsv. Se mudar de diretório, cd /home/labex/project/pickup traz você de volta.
Compare dois conjuntos ordenados
Um conjunto, aqui, é uma lista de IDs distintos. comm compara dois arquivos ordenados. Sua primeira coluna contém IDs apenas da primeira entrada; a segunda, IDs apenas da segunda; e a terceira, IDs presentes nas duas. -23 oculta as colunas 2 e 3, deixando somente os IDs da primeira entrada que não aparecem na segunda. Isso é exatamente o conjunto de IDs pagos menos os IDs cancelados.
LC_ALL=C mantém a ordenação e a comparação consistentes neste terminal. tail -n +2 remove o cabeçalho; sort -u ordena e remove linhas idênticas de IDs. Um pipe passa a saída ao próximo comando. > salva em um arquivo de trabalho separado, substituindo-o em uma nova tentativa; nunca use o caminho de entrada como caminho de saída.
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 foi removido; os outros pedidos pagos permanecem. Se surgir um aviso de entrada não ordenada, recrie os dois conjuntos de entrada com a configuração acima. Não remova pedidos das origens nem interprete a falta de informação de pagamento como autorização para embalar.
Crie a lista de produtos e abra etiquetas reais
Nesta etapa, você preservará cada produto e quantidade dos IDs elegíveis e usará sua entrega real. Comece em Workstation.
Relacione os IDs a todas as linhas de produtos
Um ID de pedido pode aparecer em várias linhas de orders.tsv. P101 precisa de rye e oat. Três IDs elegíveis não significam três unidades de pão. Mantenha cada linha original de produto e sua quantidade.
Leia a tabela:
cat source/orders.tsv
Os quatro campos são order_id, customer, item, quantity, separados por tabulações. A primeira linha é o cabeçalho. tail -n +2 remove apenas esse cabeçalho. TAB=$(printf '\t') salva uma tabulação em uma variável do shell. -t "$TAB" instrui sort e join a usá-la; as aspas duplas mantêm um único argumento. sort -k1,1 -k3,3 ordena as linhas por ID do pedido e depois pelo código do produto, preservando os quatro campos. Não substitua essa tabela de produtos por uma seleção apenas do campo de ID com sort -u.
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 relaciona os primeiros campos de entradas ordenadas. A primeira entrada contém IDs elegíveis; a segunda contém todas as linhas de produtos. Seu comportamento padrão, que mantém apenas correspondências, é útil aqui: apenas os pedidos elegíveis permanecem, e todas as linhas de produtos correspondentes são emitidas. O ID aparece uma vez, seguido do nome do cliente, produto e quantidade.
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
Os espaços acima são tabulações. São cinco linhas de produtos para três pedidos. Confira os dois produtos distintos e as quantidades de P101 antes de entregar o arquivo.
Forneça um formato claro a quem recebe
O leitor precisa do mesmo cabeçalho de quatro campos. printf interpreta \t como tabulação e \n como quebra de linha. > inicia um novo destino; >> acrescenta dados sem apagar o cabeçalho. Repetir esses dois comandos substitui a entrega anterior de forma limpa, em vez de adicionar linhas duplicadas.
printf 'order_id\tcustomer\titem\tquantity\n' > pickup-list.tsv
cat work/pickup.rows >> pickup-list.tsv
cat pickup-list.tsv
Use a entrega, além de conferir um total
Mude para Pickup Preview e abra Pickup list. Atualize se a página já estiver aberta. Você deve ver 3 collection bags · 5 item lines · 7 pieces. Esses totais ajudam a encontrar erros, mas não provam que cada pessoa recebeu o conteúdo certo.
Abra a etiqueta P101 de Alex. Ela deve mostrar Oat cookie 1 e Rye loaf 2. Siga All collection bags, abra P104 e confirme Oat cookie 2 para Noor; P105 entrega a Jules Oat cookie 1 e Rye loaf 1. P102, P103 e P106 não devem ter sacola. Os nomes dos clientes, sozinhos, não estabelecem essas relações.
Use Print label para abrir o diálogo de impressão, caso o navegador ofereça suporte; cancele após visualizar. Não é necessária uma impressora física. Volte à lista e selecione Download the actual list. O download contém o mesmo TSV que você criou, não uma referência pré-calculada.
Se a visualização explicar um erro de formato, inspecione o cabeçalho e as tabulações em Workstation, recrie o arquivo e atualize a página. Se as quantidades estiverem erradas, compare work/pickup.rows com os pedidos de origem. O leitor não corrige seu trabalho silenciosamente.
Inclua um pedido tardio sem duplicar as sacolas anteriores
Nesta etapa, você recriará a entrega a partir de um retrato completo e atualizado das entradas. Comece em Workstation, usando as mesmas configurações do shell de antes.
Entenda a nova entrada
Os arquivos originais em source/ permanecem intactos. source/late/ contém um retrato posterior completo das três tabelas, não algumas linhas para acrescentar ao resultado. Um novo pedido pago, P107, pertence a Aya e precisa de dois biscoitos de aveia. O cancelamento anterior continua valendo.
cat source/late/orders.tsv
cat source/late/payments.tsv
O arquivo fornecido paid-order-ids.txt descreve o retrato original. Para incluir o novo pedido, calcule um novo conjunto pago a partir da tabela posterior de pagamentos. grep $'\tpaid$' seleciona uma tabulação e o status exato no fim da linha, evitando unpaid; cut -f1 mantém o ID do pedido. sort -u prepara o conjunto de IDs para comparação. Mantenha LC_ALL=C e TAB das etapas anteriores; restaure-os aqui se tiver reconectado.
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
Você aplicou a mesma regra a um novo retrato completo. Agora recrie a entrada de produtos para a junção e o arquivo de destino:
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
Agora devem existir seis linhas de produtos: as cinco anteriores mais P107/Aya/oat/2. O cabeçalho aparece uma única vez. Recriar a partir do retrato completo evita acrescentar novamente todas as linhas antigas.
Confira a nova entrega real
Mude para Pickup Preview, abra Pickup list e atualize. Espere 4 collection bags · 6 item lines · 9 pieces. Abra P107 e confirme os dois biscoitos de aveia de Aya. Abra P101 novamente e confira se suas duas linhas de produtos continuam corretas. O cancelado P103 e o não pago P102 continuam sem etiquetas.

Baixe a lista real novamente e compare seu conteúdo com a entrega atualizada. A página Records mantém intencionalmente o retrato original para dar contexto; as entradas posteriores são os arquivos que você leu em source/late/. Uma página desatualizada não prova que a repetição dos comandos falhou: atualize antes de comparar.
Se os totais dobraram, volte aos dois comandos que gravam o destino: > precisa criar um cabeçalho novo antes que >> acrescente as linhas atuais. Se P107 estiver ausente, confira se tanto os pagamentos quanto as linhas de produtos vieram de source/late/. Corrija os arquivos de trabalho e recrie o resultado; nunca substitua as linhas reais de pedidos pelo total esperado.
Resumo
Você comparou conjuntos ordenados de IDs, relacionou pedidos elegíveis a todas as linhas de produtos e produziu uma lista real de retirada com etiquetas para as sacolas. Recriou o mesmo fluxo para um retrato posterior completo sem duplicar as sacolas anteriores. O desafio independente dos workshops usa os mesmos métodos com outras relações de elegibilidade e outros materiais.



