2012-08-11 3 views

risposta

4

divide & conquista: farlo in due fasi:

  1. uso awk introdurre riga vuota
    per separare ogni record due righe: NR%2==0 {print ""}
  2. 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.

6

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 
4

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 
3

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.