빵 수령 목록 만들기

LinuxBeginner
지금 연습하기

소개

EARLY CRUMB에는 토요일 포장 담당자가 실제로 쓸 목록이 필요합니다. 결제 완료 주문도 취소될 수 있고, 유효한 한 주문에 여러 상품이 필요할 수도 있습니다. 올바른 주문과 모든 수량을 유지한 다음 개별 봉투 라벨로 인계하는 것이 여러분의 일입니다.

이 독립 실습은 원본 기록 전체와 정렬된 결제 완료 주문 ID 파일을 제공합니다. 이전 VM의 파일은 필요 없습니다. 기본적인 터미널 사용 경험이면 충분하며, 선택·정렬·결합에 필요한 명령은 사용할 때 설명합니다. 애플리케이션이나 범용 스크립트를 작성하지 않습니다.

파일은 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

이 정렬된 파일은 이번 실습에서 제공됩니다. P103을 포함하여 결제 상태가 정확히 paid인 ID를 담고 있습니다. 판단에 필요한 다른 입력도 읽으세요.

cat source/cancellations.tsv
order_id
P103

source/는 그대로 유지합니다. work/ 아래 파일과 최종 pickup-list.tsv는 다시 만들어도 됩니다. 다른 디렉터리로 이동했다면 cd /home/labex/project/pickup으로 돌아옵니다.

정렬된 두 집합 비교하기

여기서 집합은 서로 다른 ID 목록입니다. comm은 정렬된 파일 두 개를 비교합니다. 첫 열은 첫 입력에만 있는 ID, 둘째 열은 둘째 입력에만 있는 ID, 셋째 열은 양쪽에 있는 ID입니다. -23은 2열과 3열을 숨겨 첫 입력에는 있고 둘째 입력에는 없는 ID만 남깁니다. 바로 결제 완료 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, 상품 코드 순으로 정렬합니다. 주문 ID 필드만 뽑아 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은 정렬된 입력의 첫 필드를 연결합니다. 첫 입력에는 유효한 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가 보여야 합니다. 합계는 실수를 찾는 데 도움이 되지만 각 사람의 내용물이 올바르다는 증거는 아닙니다.

Alex의 P101 라벨을 여세요. Oat cookie 1과 Rye loaf 2가 나와야 합니다. All collection bags로 돌아가 P104를 열고 Noor의 Oat cookie 2를 확인하세요. 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는 최초 스냅샷을 설명합니다. 새 주문을 넣으려면 나중 결제 표에서 새로운 결제 완료 집합을 계산해야 합니다. 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에는 여전히 라벨이 없습니다.

이전 봉투를 중복하지 않고 Aya를 포함한 실제 수정 인계 목록

실제 목록을 다시 내려받아 수정된 인계 내용과 비교하세요. Records 페이지는 맥락을 보여 주기 위해 최초 스냅샷을 의도적으로 유지합니다. 나중 입력은 source/late/에서 읽은 파일입니다. 오래된 브라우저 화면이 명령 재실행 실패의 증거는 아닙니다. 비교 전에 새로고침하세요.

합계가 두 배라면 대상 파일을 쓰는 두 명령으로 돌아가세요. >로 새 머리글을 만든 뒤 >>로 현재 행을 붙여야 합니다. P107이 없다면 결제와 상품 행 모두 source/late/에서 가져왔는지 확인하세요. 작업 파일을 수정해 다시 생성하세요. 실제 주문 행 대신 예상 합계를 적어 넣지 마세요.

요약

정렬된 ID 집합을 비교하고, 유효한 주문을 모든 상품 행에 연결하여 실제 수령 목록과 봉투 라벨을 만들었습니다. 나중 시점의 전체 스냅샷에도 같은 과정을 적용하면서 이전 봉투가 중복되지 않게 했습니다. 독립 워크숍 도전 과제에서는 다른 유효성 관계와 재료를 대상으로 같은 방법을 사용합니다.