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à tr
có 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 tr
thô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 awk
cũ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ị 1
trí 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à 1
in 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