o misterioso script awk une linhas

2

Eu tenho um arquivo de texto que tem blocos de linhas não vazias consecutivas separadas por uma linha em branco. Eu quero juntar as linhas em um bloco (semelhante à tecla "J" no editor vi). Aqui Encontrei o seguinte script por "cfajohnson", que faz o trabalho:

awk 'BEGIN { RS = ""; OFS = " "}
           {$1 = $1; print }'

processando o arquivo

hello
    world

this
    is
  another
line

hello world
this is another line

(Em duas máquinas Solaris (SunOS 5.11 11.1 e SunOS 5.10 Generic_147440-16) recebo uma falha de segmentação quando os blocos foram separados por três ou mais linhas vazias.No Linux também funciona se estiverem separados por duas ou mais linhas )

Do manual do awk (Linux):

 Assigning a value to an existing field causes 
 the whole record to be rebuilt when $0 is referenced.
...
OFS         The output field separator, a space by default.
...
RS          The input record separator, by default a newline.

Parece que o script também funciona se omitirmos

RS=" "
declaração

no bloco BEGIN (em branco é o valor padrão do RS) Eu não entendo porque este script se une às linhas, remova o whitspace inicial e final.

Alguém pode explicar como esse script funciona?

    
por miracle173 16.06.2016 / 19:18

1 resposta

4

Você pode omitir o OFS=" " , mas o RS="" (ou equivalente) é essencial para colocar o awk no modo de parágrafo .

Do manual GNU awk , 4.8 Registros de várias linhas (outros tipos de comportamento se comportam de maneira semelhante, AFAIK):

Another technique is to have blank lines separate records. By a special dispensation, an empty string as the value of RS indicates that records are separated by one or more blank lines. When RS is set to the empty string, each record always ends at the first blank line encountered. The next record doesn’t start until the first nonblank line that follows. No matter how many blank lines appear in a row, they all act as one record separator. (Blank lines must be completely empty; lines that contain only whitespace do not count.)

Neste modo, os campos ainda são separados no espaço em branco por padrão, mas os espaços em branco agora incluem novas linhas (simples). O separador de campo saída padrão é um espaço único, portanto, tudo o que é necessário para transformar cada registro de várias linhas em uma única linha de campos separados por espaço é forçar awk a reconstruir a variável de registro $0 , que é obtido como um efeito colateral da atribuição $1=$1 - veja por exemplo Famosos Awk One-Liners Explained, Parte II: Conversão de Texto e Substituição , 27. Exclua os espaços em branco iniciais e finais de cada linha (aparar).

    
por 16.06.2016 / 20:38

Tags