Làm cách nào để sử dụng ^ # $ làm dấu tách bản ghi trong awk?


8

Làm thế nào để bạn bảo awk sử dụng một #ký tự trong một dòng làm dấu tách bản ghi? Vấn đề là bạn không thể nói RS="^#$"^khớp với phần đầu của tệp chứ không phải phần đầu của dòng và RS="#\n"không hoạt động vì nó khớp với các #ký tự không nằm ở đầu dòng.

$ data='#
first record, first field
first record, second field
#
second record, first field#
second record, second field
'

Sau đó in trường đầu tiên của mỗi bản ghi, sử dụng RS="#\n":

$ printf "%s" "$data" | awk '
  BEGIN { RS="#\n"; FS="\n" }
  /./ {print $1}
  '
first record, first field
second record, first field
second record, second field

Dòng cuối cùng là sai vì nó không phải là trường đầu tiên mà là trường thứ hai. Đầu ra dự định là

first record, first field
second record, first field#

1
Bạn có thể vui lòng cung cấp một ví dụ về đầu ra mà bạn yêu cầu
roaima

vậy dữ liệu của bạn trông như thế line one#line two#line threenào?
Skaperen

RS="#"làm gì?
Skaperen

@Skaperen không, dữ liệu trông như thế nào #\nrecord one\n#\nrecord twovà mỗi bản ghi bao gồm nhiều \ntrường khác nhau.
Ernest A

RS='#\n'nên hoạt động afaik - mặc dù nó sẽ coi ban đầu #là chấm dứt một bản ghi trống (tức là tất cả các NRgiá trị sẽ bị "tắt" bởi một người)
Steeldo

Câu trả lời:


6

Đây là một cách để làm điều đó trong awk:

$ printf "%s\n" "$data" | 
    awk -F'\n' -v RS='(^|\n)#\n' '/./ {print $1}' 
first record, first field
second record, first field#

Bí quyết là để thiết lập phân cách ghi vào một trong hai đầu của tập tin ( ^), hoặc một dòng mới, tiếp theo là một #và một newline \n.



1
Lưu ý các NR sẽ là một lần trong trường hợp này (thử thay thế /./bằng NR==1). Tôi nghĩ giải pháp đơn giản nhất là kết thúc tập tin / dữ liệu - thay vì bắt đầu - với một #dòng trên một dòng riêng biệt. Sau đó \n#\ncó thể được sử dụng như RS và nó sẽ hoạt động đúng.
don_crissti

@don_crissti Tôi vừa sao chép nó từ OP. Tôi giả sử họ đang sử dụng nó để tránh các dòng trống nên NR==1sẽ không hoạt động nếu có nhiều dòng trống hơn nữa.
terdon
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.