Como usar ^ # $ como separador de registros no awk?


8

Como você diz ao awk para usar um #caractere sozinho em uma linha como separador de registros? O problema é que você não pode dizer RS="^#$"porque ^corresponde ao início do arquivo, não ao início de uma linha, e RS="#\n"também não funciona porque corresponde a #caracteres que não estão no início de uma linha.

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

Em seguida, imprima o primeiro campo de cada registro, usando 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

A última linha está errada porque não é o primeiro campo, mas o segundo. A saída pretendida foi

first record, first field
second record, first field#

1
Você poderia agradar também fornecem um exemplo da saída que você precisa
roaima

para que seus dados se pareçam line one#line two#line three?
21415 Skaperen

e RS="#"faz o que?
21415 Skaperen

@ Skaperen no, os dados se parecem #\nrecord one\n#\nrecord twoe cada registro consiste em vários \ncampos separados.
Ernest A

RS='#\n'deve funcionar afaik - embora possa tratar o inicial #como encerra uma ficha vazio (ou seja, todos os NRvalores serão "off" por um)
steeldriver

Respostas:


6

Aqui está uma maneira de fazer isso awk:

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

O truque é definir o separador de registros como o início do arquivo ( ^) ou uma nova linha, seguida por uma #e outra nova linha \n.



1
Observe que as NRs serão pontuais neste caso (tente substituir /./por NR==1). Eu acho que a solução mais fácil seria ter o arquivo / dados terminando - em vez de iniciar - com um #em uma linha separada. Então \n#\npoderia ser usado como RS e funcionaria corretamente.
31515 Don_crissti

@don_crissti Acabei de copiar isso do OP. Suponho que eles estejam usando-o para evitar linhas em branco, portanto NR==1não funcionará se houver mais linhas em branco mais abaixo.
terdon
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.