Bạn có thể nghĩ rằng ORS và OFS awk của sẽ là một cách hợp lý để xử lý này:
$ awk '{print $1,$2}' OFS="-" ORS=", " input.txt
Nhưng kết quả này trong một ORS thức vì đầu vào chứa một dòng mới trên dòng cuối cùng. Dòng mới là một dấu phân cách bản ghi, do đó, từ quan điểm của awk có một bản ghi cuối cùng trống trong đầu vào.Bạn có thể làm việc xung quanh điều này với một chút hackery, nhưng kết quả phức tạp loại bỏ sự sang trọng của một lớp lót.
Vì vậy, đây là cách tôi thực hiện việc này. Vì bạn nói bạn đang "viết nhiều giá trị cột", có thể việc mucking bằng ORS và OFS sẽ gây ra sự cố. Vì vậy, chúng tôi có thể đạt được sản lượng mong muốn hoàn toàn với định dạng.
$ cat input.txt
3 2
5 4
1 8
$ awk '{printf "%s%d-%d",t,$1,$2; t=", "} END{print ""}' input.txt
3-2, 5-4, 1-8
Điều này tương tự như cách tiếp cận một lần của Michael và rook, nhưng nó sử dụng một đơn lẻ để định dạng.
Điều này có thể sẽ hoạt động tốt hơn đáng kể so với giải pháp của Michael vì một bài tập nên lấy ít CPU hơn bài kiểm tra và đáng chú ý hơn bất kỳ giải pháp multi-pass nào vì tệp chỉ cần đọc một lần.
Cảm ơn bạn, đúng vậy! – Perlnika
FYI, việc sử dụng 'tr' và' paste' này sẽ hoạt động trong bất kỳ môi trường POSIX nào, nó không bị hạn chế đối với các lõi của GNU. – ghoti