Bagaimana cara menggunakan ^ # $ sebagai pemisah rekaman di awk?

8

Bagaimana Anda memberi tahu awk untuk menggunakan #karakter dengan sendirinya di baris sebagai pemisah rekaman? Masalahnya adalah Anda tidak bisa mengatakannya RS="^#$"karena ^cocok dengan awal file, bukan awal baris, dan RS="#\n"tidak berfungsi karena cocok dengan #karakter yang tidak ada di awal baris.

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

Kemudian cetak bidang pertama dari setiap catatan, menggunakan 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

Baris terakhir salah karena ini bukan bidang pertama tetapi yang kedua. Output yang dimaksudkan adalah

first record, first field
second record, first field#
Ernest A
sumber
1
Bisakah Anda juga memberikan contoh output yang Anda butuhkan
roaima
jadi data Anda terlihat seperti line one#line two#line three?
Skaperen
dan RS="#"melakukan apa?
Skaperen
@Skaperen tidak, data tampak seperti #\nrecord one\n#\nrecord twodan setiap catatan terdiri dari beberapa \nbidang yang dipisahkan.
Ernest A
RS='#\n'harus bekerja afaik - meskipun akan memperlakukan awal #sebagai penghentian catatan kosong (yaitu semua NRnilai akan "dimatikan" oleh satu)
steeldriver

Jawaban:

6

Inilah salah satu cara melakukannya awk:

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

Caranya adalah dengan mengatur pemisah record untuk baik awal file ( ^), atau baris baru, diikuti oleh #dan lain baris baru \n.


terdon
sumber
1
Perhatikan NR akan satu kali dalam kasus ini (coba ganti /./dengan NR==1). Saya pikir solusi termudah adalah memiliki akhir file / data - bukannya memulai - dengan #pada baris yang terpisah. Kemudian \n#\nbisa digunakan sebagai RS dan itu akan berfungsi dengan baik.
don_crissti
@don_crissti Saya baru saja menyalinnya dari OP. Saya berasumsi mereka menggunakannya untuk menghindari garis kosong sehingga NR==1tidak akan berfungsi jika ada lebih banyak garis kosong di bawahnya.
terdon