Come usare ^ # $ come separatore di record in awk?


8

Come dici a awk di usare un #personaggio da solo in una riga come separatore di record? Il problema è che non puoi dire RS="^#$"perché ^corrisponde all'inizio del file, non all'inizio di una riga e RS="#\n"non funziona neanche perché corrisponde a #caratteri che non sono all'inizio di una riga.

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

Quindi stampare il primo campo di ciascun record, utilizzando 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

L'ultima riga è errata perché non è il primo campo ma il secondo. L'output previsto era

first record, first field
second record, first field#

1
Potresti fornire anche un esempio dell'output richiesto
roaima

quindi i tuoi dati sembrano line one#line two#line three?
Skaperen,

e RS="#"cosa fa?
Skaperen,

@Skaperen no, i dati sono simili #\nrecord one\n#\nrecord twoe ogni record è costituito da più \ncampi separati.
Ernest A

RS='#\n'dovrebbe funzionare afaik - anche se tratterà l'iniziale #come terminare un record vuoto (cioè tutti i NRvalori saranno "off" di uno)
steeldriver

Risposte:


6

Ecco un modo per farlo in awk:

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

Il trucco è quello di impostare il separatore di record per entrambi l'inizio del file ( ^), o di un ritorno a capo, seguito da un #e un altro ritorno a capo \n.



1
Nota che in questo caso le NR saranno una tantum (prova a sostituirle /./con NR==1). Penso che la soluzione più semplice sarebbe quella di far terminare il file / dati - anziché iniziare - con un #su una riga separata. Quindi \n#\npotrebbe essere usato come RS e funzionerebbe correttamente.
don_crissti,

@don_crissti L'ho appena copiato dall'OP. Suppongo che lo stiano usando per evitare le righe vuote, quindi NR==1non funzionerà se ci sono più righe vuote più in basso.
terdon
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.