Cách đơn giản hơn nhiều là sử dụng tr
$ tr '_' ',' < input.csv | tr -d '"'
1,1,0,0,76
1,1,0,0,77
1,1,0,0,78
Cách thức hoạt động này là trcó hai đối số - tập hợp các ký tự được thay thế và thay thế chúng. Trong trường hợp này, chúng tôi chỉ có bộ 1 ký tự. Chúng tôi chuyển hướng luồng stdin của input.csvđầu vào trthông qua <toán tử shell và chuyển đầu ra kết quả tr -d '"'để xóa dấu ngoặc kép.
Nhưng awkcũng có thể làm được.
$ cat input.csv
"1_1_0_0_76"
"1_1_0_0_77"
"1_1_0_0_78"
$ awk '{gsub(/_/,",");gsub(/\"/,"")};1' input.csv
1,1,0,0,76
1,1,0,0,77
1,1,0,0,78
Cách thức hoạt động này hơi khác một chút: awk đọc từng dòng tệp theo từng dòng, từng tập lệnh nội tuyến /Pattern match/{ codeblock}/Another pattern/{code block for this pattern}. Ở đây chúng ta không có một mẫu, vì vậy nó có nghĩa là thực thi codeblock cho mỗi dòng. gsub()Hàm được sử dụng để thay thế toàn cục trong một dòng, do đó chúng tôi sử dụng nó để thay thế dấu gạch dưới bằng dấu phẩy và dấu ngoặc kép bằng chuỗi null (xóa ký tự một cách hiệu quả). Vị 1trí của mẫu khớp với khối mã bị thiếu, mặc định đơn giản là in dòng; nói cách khác, codeblock gsub()thực hiện công việc và 1in kết quả.
Sử dụng chuyển hướng shell ( >) để gửi đầu ra cho một tệp mới:
awk '{gsub(/_/,",");gsub(/\"/,"")};1' input.csv > output.csv