Awk - chỉ thay thế một ký tự trong một cột nhất định


13

Tôi có một tập tin như thế này:

2018.01.02;1.5;comment 1
2018.01.04;2.75;comment 2
2018.01.07;5.25;comment 4
2018.01.09;1.25;comment 7

Tôi muốn thay thế tất cả các dấu chấm .trong cột thứ hai bằng dấu phẩy ,như cách tôi sed 's/\./\,/g' filecó thể sử dụng sedhoặc tốt nhất awklà chỉ áp dụng điều này cho cột thứ hai, vì vậy đầu ra của tôi sẽ như thế này:

2018.01.02;1,5;comment 1
2018.01.04;2,75;comment 2
2018.01.07;5,25;comment 4
2018.01.09;1,25;comment 7

Câu trả lời:


22
$ awk 'BEGIN{FS=OFS=";"} {gsub(/\./, ",", $2)} 1' ip.txt
2018.01.02;1,5;comment 1
2018.01.04;2,75;comment 2
2018.01.07;5,25;comment 4
2018.01.09;1,25;comment 7
  • BEGIN{} khối mã này sẽ được thực thi trước khi xử lý bất kỳ dòng đầu vào nào
  • FS=OFS=";" đặt dấu tách trường đầu vào và đầu ra là ;
  • gsub(/\./, ",", $2)cho mỗi dòng đầu vào, thay thế tất cả .trong trường thứ 2 bằng,
  • 1là một thành ngữ awk để in nội dung của $0(có chứa bản ghi đầu vào)

1
tuyệt vời, nhiều THX!
Nath

9
sed 's/\./,/3' file

thay thế lần xuất hiện thứ ba của dấu chấm


2
Một Usele khác Sử dụng cat... Tại sao không chỉ sed 's/\./,/3' file? (Ngoài ra, dấu phẩy không cần phải thoát.)
twalberg

Tôi đã tính đến các quan sát
Emilio Galarraga

catsẽ không nhất thiết là vô dụng ở đây. Nó sẽ cho phép các hoạt động để sử dụng 2 lõi.
ronman rothman

@ronrothman mục đích của lõi chạy catlà gì, ngoài việc sử dụng hết tài nguyên? Có thể để cung cấp một bộ đệm nhỏ, nhưng sau đó ý định này nên được thể hiện tốt hơn bằng một công cụ như bufferhơn cat.
Roland Illig

Để tách đĩa (chặn) đọc từ thay thế chuỗi. Vâng, tôi cho rằng bạn có thể nghĩ về nó như là bộ đệm.
ron rothman

4

Thực hiện theo phương pháp dưới đây bằng awk

Chỉ huy: awk -F ";" '{gsub(/\./,",",$2);print $1";"$2";"$3}' filename

đầu ra

2018.01.02;1,5;comment 1
2018.01.04;2,75;comment 2
2018.01.07;5,25;comment 4
2018.01.09;1,25;comment 7
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.