AWK: A mágica do operador ternário

O problema:
Inserir uma linha em branco a cada duas linhas

A Solução:
seq 10 | awk 'ORS=NR%2 ? RS:RS RS'

A Explicação:
ORS = Operador de registro de saída, determina qual será o separador de registros de saída

NR = número do registro por padrão "número da linha"

Na prática o que vai acontecer é o seguinte, ao testar o Módulo da divisão da linha 1 por 2 obtemos 1 e portanto o Awk definirá o operador de registro de saída como RS (separador de registros "quebra de linha por padrão")

quando o awk processar a linha 2 e obtiver o módulo da divisão  da mesma por 2 ele atribuirá uma dupla quebra de linha para o opeardor de registros de saída.

Aquele sinal de igual é uma atribuição que dependerá do valor do módulo obtido.


awk ternary operator to insert blank line

seq 10 | awk 'ORS=NR%2 ? RS:RS RS'
seq 10 ........... gives us 1 to 10 (one by line)
| ................ pipes each line to awk

Awk uses a ternary operator like: statemente-condition ? if-true: if-false

If the result of Mod of NR equals to 1, it sets ORS to the RS (newline) if the result of Mod of NR equals to 0, it set ORS to RS RS (double newline) inserting hence a blank line

ORS .............. output register separator (default newline)
NR % 2  .......... Mod of the integer division of Number of Register (line number)

let's try something here:

echo '1%2' | bc 
1

echo '2%2' | bc
0

echo '3%2' | bc
1

Therefore:

seq 10 | awk 'ORS=NR % 2 ? RS:RS RS'

Portuguese explanation:

ORS ............ separador de registro de saída

Caso o módulo da divisão do Número do Registro NR por 2 for igual a 1 atribua uma quebra de linha para o separador de registro de saída, caso contrário atribua duas quebras de linha para o separador de registro de saída

linux-cookbook

Grupos do Google
Participe do grupo linux-cookbook
E-mail:
Visitar este grupo