Mi chiedo come utilizzare Awk per elaborare ogni 2 righe di dati anziché tutti. Per impostazione predefinita, il separatore di record (RS) è impostato su ogni nuova riga, come posso cambiarlo su ogni 2 righe.awk per modificare il separatore di record (RS) ogni 2 righe
risposta
divide & conquista: farlo in due fasi:
- uso awk introdurre riga vuota
per separare ogni record due righe:NR%2==0 {print ""}
- tubo a un altro processo awk e
set di record separatore a riga vuota:BEGIN {RS=""}
Vantaggio: nel secondoNella procedura, tutti i campi delle due linee sono accessibili come $1 to $NF
.
awk '{print}; NR%2==0 {print ""}' data | \
awk 'BEGIN {RS=""}; {$1=$1;print}'
Nota:
$1=$1
è qui utilizzato per applicare un aggiornamento sulla $0
(tutto il disco).
Ciò garantisce che l'output stampi il record su due righe su un'unica riga.
Dopo aver modificato un campo nel programma quando si elaborano i record a due righe, questo non è più necessario.
Dipende da ciò che si desidera ottenere, ma un modo è utilizzare l'istruzione getline
. Per ogni riga, leggi il prossimo e salvalo in una variabile. Così si avrà prima linea in $0
e seconda in even_line
:
getline even_line
Se si desidera unire linee, utilizzare l'paste
utility:
$ printf "%s\n" one two three four five
one
two
three
four
five
$ printf "%s\n" one two three four five | paste -d " " - -
one two
three four
five
Questo è un po 'hacker, ma è un letterale rispondi alla tua domanda:
awk 'BEGIN {RS = "[^\n]*\n[^\n]*\n"} {$0 = RT; print $1, $NF}' inputfile
Imposta il separatore di record su un'espressione regolare che corrisponde a due righe. Quindi, per ogni riga, impostare $0
sul terminatore del record (che corrisponde alla regex in RS
). Questo esegue la suddivisione in campo su FS
. L'estratto conto è solo un segnaposto dimostrativo.
Si noti che $0
conterrà due newline, ma i campi non conterranno nessuna nuova riga.