2012-08-11 26 views

Respuesta

4

Divide & Conquer: hacerlo en dos pasos:

  1. uso awk para introducir línea en blanco
    para separar cada registro de dos líneas: NR%2==0 {print ""}
  2. tubo a otro proceso awk y
    registro conjunto separador a línea en blanco: BEGIN {RS=""}

Ventaja: En el segundoProcesotiene todos los campos de las dos líneas accesibles como $1 to $NF.

awk '{print}; NR%2==0 {print ""}' data | \ 
awk 'BEGIN {RS=""}; {$1=$1;print}' 

Nota:
$1=$1 se utiliza aquí para hacer cumplir una actualización sobre $0 (el conjunto de registro).
Esto garantiza que la salida imprime el registro de dos líneas en una línea.
Una vez que modifica un campo en su programa cuando procesa los registros de dos líneas, esto ya no es necesario.

6

Depende de lo que desea lograr, pero una forma es utilizar la instrucción getline. Para cada línea, lea el siguiente y guárdelo en una variable. Por lo que tendrá primera línea en $0 y segunda en even_line:

getline even_line 
4

Si desea combinar líneas, utilice el paste utilidad:

$ 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

Esto es un poco hacker, pero es un literal responda a su pregunta:

awk 'BEGIN {RS = "[^\n]*\n[^\n]*\n"} {$0 = RT; print $1, $NF}' inputfile 

Establezca el separador de registros en una expresión regular que coincida con dos líneas. Luego, para cada línea, configure $0 en el terminador de registros (que es lo que coincide con la expresión regular en RS). Esto realiza la división de campo en FS. La declaración de impresión es solo un titular de lugar de demostración.

Tenga en cuenta que $0 contendrá dos líneas nuevas, pero los campos no contendrán ninguna línea nueva.

Cuestiones relacionadas