Bây giờ tôi hiểu những gì bạn có nghĩa là "mảng", tôi suy nghĩ - trước hết - bạn nên xem xét sử dụng các mảng Bash thực tế. Chúng linh hoạt hơn nhiều, trong đó các phần tử mảng (ví dụ) có thể chứa khoảng trắng và bạn có thể tránh rủi ro *
và ?
sẽ kích hoạt mở rộng tên tệp.
Nhưng nếu bạn thích sử dụng cách tiếp cận hiện tại của bạn của chuỗi khoảng trắng được phân định, sau đó tôi đồng ý với đề nghị RHT để sử dụng Perl:
result=$(perl -e 'my %array2 = map +($_ => 1), split /\s+/, $ARGV[1];
print join " ", grep $array2{$_}, split /\s+/, $ARGV[0]
' "$array1" "$array2")
(Các dòng-chia chỉ là để có thể đọc, bạn có thể thoát khỏi Nếu bạn muốn.)
Trong lệnh Bash ở trên, chương trình Perl được nhúng tạo băm có tên %array2
chứa các phần tử của mảng thứ hai, sau đó in bất kỳ phần tử nào của mảng đầu tiên tồn tại trong %array2
.
Điều này sẽ hoạt động hơi khác với mã của bạn trong cách xử lý các giá trị trùng lặp trong mảng thứ hai; trong mã của bạn, nếu array1
chứa x
hai lần và array2
chứa x
ba lần, sau đó result
sẽ chứa x
sáu lần, trong khi đó trong mã của tôi, result
sẽ chứa x
chỉ hai lần. Tôi không biết điều đó có quan trọng không, vì tôi không biết yêu cầu chính xác của bạn.
tôi don không nghĩ rằng bạn sẽ tìm thấy một cách tốt hơn để làm điều này. Bash không thực sự được xây dựng cho thao tác mảng, và tôi không thể nghĩ ra một công cụ dòng lệnh có thể được sử dụng để tìm giao điểm của hai mảng. –
Đây là nơi Perl tỏa sáng. – RHT