Como alterar a variável RS no AWK entre os arquivos de maneira portátil

3
Ao olhar para outra questão, me deparei com um problema que eu não poderia resolver geralmente para o awk, onde um programa awk pega dois arquivos (ou seja, para ler entradas do primeiro em um array para comparar, como é frequentemente o case) qual é a melhor maneira de lidar com a mudança de RS entre os arquivos?

Dados os seguintes arquivos:

~$> cat awktest1.txt 
111 112 113 114|121 122 123 124|131 132 133 134|141 142 143 144
 ~$> cat awktest2.txt 
211 212 213 214

221 222 223 224

231 232 233 234

241 242 243 244

se eu quisesse executar o seguinte, como um exemplo básico:

#! /usr/bin/awk -f

# awktest.awk file1 file2
# cant swap RS between files

BEGIN { RS="|" }

NR>ONR && ONR==1 { RS="" }
{ print $1 "." $2 "." $3 "." $4 }

# will work with with, but this is GNU only.
# ENDFILE { RS="" }
END { print "\nfinal $0: \n" $0 }

então, como RS está mudando depois que o primeiro registro do segundo arquivo foi lido, então neste (exemplo admitido) a saída é:

~$>./awktest.awk awktest1.txt awktest2.txt 
111.112.113.114
121.122.123.124
131.132.133.134
141.142.143.144
211.212.213.214

final $0:
211 212 213 214

221 222 223 224

231 232 233 234

241 242 243 244

com todo o segundo arquivo sendo lido como um único registro, em vez de 4. Claramente com este exemplo, seria simples corrigir o problema antes do awk, mas existe alguma maneira no awk?

    
por Guy 20.01.2018 / 21:46

1 resposta

6

Argumentos como nomes de arquivos e atribuições podem ser misturados para que você possa executar:

awk '{ print $1 "." $2 "." $3 "." $4 }' RS='|' file1 RS='' file2

como awk irá processá-los para que você possa definir um RS diferente para cada arquivo.

    
por 20.01.2018 / 21:59