awk nhiều mẫu phù hợp và in trong một dòng


8

Tôi có tập tin sau:

$ cat disk.out
disk0
fcs0
text
text
text
disk1
fcs1
text
text
text
text
...

Những gì tôi đang cố gắng đạt được là khớp "đĩa" + "fcs" và sau đó in cặp thành một dòng, như sau:

disk0,fcs0
disk1,fcs1
...

Vì vậy, tôi khớp "đĩa" và "fcs" với awkvà thay đổi dấu tách bản ghi đầu ra thành ",". `

$ awk '/disk|fcs/' ORS="," disk.out
disk0,fcs0,disk1,fcs1,

Vấn đề là, nó sẽ in tất cả các trận đấu trên một dòng và với một dấu ,. Làm thế nào tôi chỉ có thể in mỗi trận đấu trong một dòng? Như thế này:

disk0,fcs0
disk1,fcs1
...

Câu trả lời:


9

Bạn phải lưu dòng "đĩa" (không in) cho đến khi bạn tìm thấy dòng "fcs" tiếp theo:

awk '/disk/{ DISK=$0; next } /fcs/{ print DISK "," $0 }'

Vấn đề với cách tiếp cận của bạn là nó in một dòng khớp với "đĩa" hoặc "fcs", mà không kết hợp các dòng đó.

Chỉnh sửa: tập lệnh của sp asic mạnh mẽ hơn, trong đó nó bỏ qua

disk3
text
fcs3

Kịch bản của tôi sẽ vui vẻ in "đĩa3, fcs3" trong trường hợp này.


8
$ awk '/fcs/ && a ~ /disk/ {print a","$0} {a=$0}' disk.out
disk0,fcs0
disk1,fcs1

6

Nếu nó luôn ở định dạng đó (một fcs cho một đĩa, fcs luôn sau đĩa), bạn có thể làm mà không cần awk:

grep -F -e disk -e fcs file | paste -d , - -

Hoặc là:

awk '(/disk/ && ORS=",") || (/fcs/ && ORS=RS)' file

Mặc dù với awk, bạn có thể thích một cách tiếp cận dễ đọc hơn như được đưa ra bởi Martin hoặc sp asic.

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.