¿Cómo usar ^ # $ como separador de registros en awk?


8

¿Cómo se le dice a awk que use un #carácter en sí mismo en una línea como separador de registros? El problema es que no se puede decir RS="^#$"porque ^coincide con el comienzo del archivo, no con el comienzo de una línea, y RS="#\n"tampoco funciona porque coincide con los #caracteres que no están al principio de una línea.

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

Luego imprima el primer 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

La última línea está mal porque no es el primer campo sino el segundo. El resultado previsto fue

first record, first field
second record, first field#

1
Podrían estar ustedes también proporcionan un ejemplo de la salida que necesita
roaima

¿Así se ven tus datos line one#line two#line three?
Skaperen

y RS="#"hace que
Skaperen

@Skaperen no, los datos se ven #\nrecord one\n#\nrecord twoy cada registro consta de múltiples \ncampos separados.
Ernest A

RS='#\n'debe trabajar que yo sepa - a pesar de que tratará la inicial #como terminación de un registro vacío (es decir, todos los NRvalores serán "off" por uno)
steeldriver

Respuestas:


6

Aquí hay una forma de hacerlo awk:

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

El truco consiste en establecer el separador de registro a cualquiera del principio del archivo ( ^), o un salto de línea, seguida de una #y otra de nueva línea \n.



1
Tenga en cuenta que los NR serán únicos en este caso (intente reemplazar /./con NR==1). Creo que la solución más fácil sería hacer que el archivo / datos finalicen, en lugar de comenzar, con un #en una línea separada. Entonces \n#\npodría usarse como RS y funcionaría correctamente.
don_crissti

@don_crissti Acabo de copiar eso desde el OP. Supongo que lo están usando para evitar líneas en blanco, por NR==1lo que no funcionará si hay más líneas en blanco más abajo.
terdon
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.