Câu trả lời hàng đầu cho câu hỏi này chỉ hoạt động đối với các dòng có một trường được trích dẫn. Khi tôi tìm thấy câu hỏi này tôi cần một cái gì đó có thể làm việc cho một số tùy ý của các lĩnh vực được trích dẫn.
Cuối cùng tôi đã đến an answer by Wintermute in another thread và ông đã cung cấp giải pháp tổng quát tốt cho vấn đề này. Tôi vừa sửa đổi nó để xóa dấu ngoặc kép. Lưu ý rằng bạn cần phải gọi awk với -F\"
khi chạy chương trình dưới đây.
BEGIN { OFS = "" } {
for (i = 1; i <= NF; i += 2) {
gsub(/[ \t]+/, ",", $i)
}
print
}
này hoạt động bằng cách quan sát rằng tất cả các yếu tố khác trong mảng sẽ là bên trong dấu ngoặc kép khi bạn tách bởi "của ký tự, và do đó nó sẽ thay thế các khoảng trắng phân chia những người không trong dấu ngoặc kép bằng dấu phẩy.
bạn có thể sau đó dễ dàng chuỗi một ví dụ của awk để làm bất cứ điều gì bạn cần xử lý (chỉ cần sử dụng công tắc lĩnh vực tách một lần nữa, -F,
)
Lưu ý rằng điều này có thể phá vỡ nếu trường đầu tiên được trích dẫn -. tôi có không Nếu nó có, mặc dù, nó sẽ được dễ dàng để sửa chữa bằng cách thêm một tuyên bố nếu bắt đầu tại 2 rath er hơn 1 nếu ký tự đầu tiên của dòng là ".
Để định dạng cho một lớp lót: 'cat data.txt | awk 'split ($ 0, a, "\" ") {$ 2 = a [2]} {$ 3 = $ (NF - 1)} {$ 4 = $ NF} {in" và các trường là ", $ 1," + ", $ 2," + ", $ 3," + ", $ 4} '' –
Điều này chỉ hoạt động nếu bạn có một trường được trích dẫn duy nhất, ở vị trí thứ hai và có tổng số 4 trường. –