Bạn nên sử dụng a while
với tích read
hợp:
while IFS= read -r line;do
fields=($(printf "%s" "$line"|cut -d',' --output-delimiter=' ' -f1-))
command "${fields[1]}" -x "${fields[2]}" ... # ${fields[1]} is field 2
done < your_file_here
Làm thế nào điều này hoạt động
- Câu
cut
lệnh lấy dòng và chia nó trên dấu phân cách được chỉ định bởi -d
.
- Ký
--output-delimiter
tự phân tách cut
sẽ sử dụng để hiển thị các trường đã chọn, ở đây chúng tôi chọn một khoảng trắng để chúng tôi có thể đặt các trường khác nhau vào mảng fields
.
- Cuối cùng, chúng tôi muốn tất cả các trường (từ trường 1 đến cuối) và đó là nơi
-f1-
phát huy tác dụng.
- Bây giờ bạn có các trường khác nhau được lưu trữ trong biến mảng
fields
, bạn có thể truy cập bất kỳ trường cụ thể nào bạn muốn với cú pháp ${field[number]}
trong đó number
ít hơn một số trường thực tế bạn muốn vì lập chỉ mục mảng là không dựa trên Bash.
Ghi chú
- Điều này sẽ thất bại nếu bất kỳ trường nào của bạn chứa khoảng trắng.
Đối với số lượng trường không đổi
Thay vào đó, bạn có thể làm điều gì đó tương tự như câu trả lời của 1_CR :
while IFS= read -r line;do
IFS=, read -r field1 field2 field3 <<-EOI
$line
EOI
command "$field2" -x "$field3" ...
done < your_file_here
Ở trên, trong khi có vẻ ồn ào hơn, nên hoạt động trong bất kỳ vỏ tuân thủ POSIX nào, không chỉ Bash.