Làm thế nào về một kịch bản shell bourne đơn giản (chủ yếu):
tr -d ':,' file.txt | while read p r; do for i in $r; do echo "$p.$i"; done; done
Lệnh "tr" chỉ xóa sạch dấu hai chấm (:) và dấu phẩy (,) - câu trả lời này dựa vào việc có khoảng trắng trong dữ liệu (mà dữ liệu mẫu có - nếu không bạn cần sử dụng sed để chuyển đổi: và, thay vào đó là khoảng trắng của tr).
Đầu ra của "tr" được dẫn vào vòng ngoài "trong khi đọc ...; do ...; xong", đọc các dòng và chia chúng thành hai, tại lần xuất hiện đầu tiên của khoảng trắng (hay đúng hơn là nội dung của "$ IFS "- dấu tách trường đầu vào shell, mặc định là khoảng trắng), để lại tiền tố trong" $ p "và phần còn lại của dòng trong" $ r ".
Vòng lặp bên trong "for i in ...; do ...; xong" sau đó phá vỡ nội dung của "$ r" tại khoảng trắng ("$ IFS") và đặt từng mục vào "$ i" trước khi thực hiện lệnh echo .
EDIT: xem bình luận - bạn hoàn toàn không cần "tr" ... dấu hai chấm và dấu phẩy có thể được làm sạch bằng cách đưa chúng vào biến IFS như vậy:
OIFS="$IFS"; IFS=":, "; while read p r; do
for i in $r; do echo "$p.$i"; done; done <file.txt; IFS="$OIFS"
tất cả được thực hiện trong trình bao - không có lệnh gọi đến các chương trình bên ngoài ... (trừ khi tiếng vang không được tích hợp). Lưu ý IFS = ở trên có khoảng trắng và tab char. Cũng lưu ý rằng $ r trong vòng lặp thứ hai không có dấu ngoặc kép xung quanh nó - đây là chủ ý nên shell sẽ phân tách nó trên khoảng trắng.