awk bất ngờ xóa dấu chấm khỏi chuỗi


9

Tôi muốn thêm một cột (vị trí thứ 2) trong một .csvtệp và tôi muốn các giá trị của cột đó là các chuỗi và được trích dẫn;

Lệnh sau không thêm cột nhưng không có dấu ngoặc kép:

awk -F"," 'BEGIN { OFS = "," } {$2="2.4.0"; print}' test.csv > output.csv

Cách tiếp cận sau đây không kết hợp các dấu ngoặc kép, nhưng vì một số lý do, nó loại bỏ .dấu chấm cuối cùng khỏi giá trị

awk -F"," 'BEGIN { OFS = "," } {$2="\""2.4.0"\""; print}' test.csv > output.csv

vì vậy giá trị của tôi cuối cùng là "2,40".

Làm thế nào tôi nên đi về điều này?


Nếu tệp của bạn có 2 cột trở lên, bạn muốn chèn hoặc thay thế cột thứ hai?
ctac_

chỉ cần chèn một cột sau cột đầu tiên
pkaramol

2
ok, vì vậy, để chèn, bạn phải sử dụng: awk 'BEGIN {FS = OFS = ","} {$ 1 = $ 1 ", \" 2.4.0 \ ""} 1'
ctac_

1
hoặc awk '{sub (",", ", \" 2.4.0 \ ",")} 1'
ctac_

Câu trả lời:


12

Bạn dường như đã có những trích dẫn sai. Bạn cần làm như dưới đây

awk -F"," 'BEGIN { OFS = "," } {$2="\"2.4.0\""; print}' test.csv > output.csv

Điều này được giải thích trong trang man GNU GNU - 3.2 Escape Sequences

Một số ký tự không thể được bao gồm theo nghĩa đen trong hằng chuỗi ("foo")hoặc hằng regrec ( /foo/). Thay vào đó, chúng nên được biểu diễn bằng các chuỗi thoát, là các chuỗi ký tự bắt đầu bằng dấu gạch chéo ngược ( \). Một cách sử dụng chuỗi thoát là bao gồm một ký tự trích dẫn kép trong hằng chuỗi. Bởi vì một trích dẫn kép đơn giản kết thúc chuỗi, bạn phải sử dụng \"để thể hiện một ký tự trích dẫn kép thực sự như là một phần của chuỗi ..


Theo như lý do tôi có thể hiểu lý do cho hành vi, awkdường như đã được hiểu 2.4.0là một từ số với các trích dẫn thêm từ OP của bạn và quyết định mất độ chính xác sau dấu chấm đầu tiên.

I E

$2="\""2.4.0"\""

trở thành

$2=""2.4.0""

awkkhông còn hiểu là một chuỗi. Bạn có thể tái tạo hành vi này bằng cách đơn giản là làm

awk 'BEGIN { print ""2.4.0"" }'
2.40

đó là kết quả khi bạn làm

awk 'BEGIN { print 2.4.0 + 0 }'

1
@roaima: Từ những gì tôi biết, dường như nó đã bị hủy bỏ và chỉ dẫn đến { print 2.4.0 }hoặc { print 2.4.0 + 0 }, tức là một thành phần không phải là chuỗi. Tôi cũng đã cố gắng tìm kiếm các tài liệu có liên quan, nhưng không thể
Inian

2
Một cách khác để thuận tiện thêm các trích dẫn mà đôi khi tôi sử dụng, là xác định một biến, ví dụ:awk -v q='"' '... print q "2.4.0" q ...
Thor
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.