如何在awk中使用^#$作为记录分隔符?


8

您如何告诉awk #在一行中单独使用一个字符作为记录分隔符?问题是您不能说RS="^#$"是因为^匹配文件的开头而不是行的开头,并且RS="#\n"也不能工作,因为它匹配#的不是行首的字符。

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

然后使用以下命令打印每个记录的第一个字段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

最后一行是错误的,因为它不是第一字段,而是第二字段。预期的输出是

first record, first field
second record, first field#

1
您能否提供所需输出的示例
roaima

所以你的数据看起来像line one#line two#line three什么?
Skaperen 2015年

RS="#"做什么?
Skaperen 2015年

@Skaperen不,数据看起来像#\nrecord one\n#\nrecord two,每个记录由多个\n分隔的字段组成。
欧内斯特

RS='#\n'应该可以使用afaik-尽管它将初始值#视为终止一个空记录(即所有NR值将被“ off”一个)
钢铁驾驶员

Answers:


6

这是在其中执行此操作的一种方法awk

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

关键是要记录分隔符设置为要么该文件(的开头^),或换行,随后是#与另一换行\n



1
请注意,保护区将一次性在这种情况下(尝试更换/./NR==1)。我认为最简单的解决方案是将文件/数据结尾-而不是开头- #在单独的一行上。然后\n#\n可以用作RS,并且可以正常工作。
don_crissti

@don_crissti我只是从OP复制了它。我假设他们正在使用它来避免出现空白行,因此,NR==1如果下方还有更多的空白行,将无法正常工作。
terdon
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.