-
awk
normalmente lê cada linha da entrada e invoca o script nela. Os casos em que você usariagetline
são poucos e distantes entre si. Quando seu script é executado com seis linhas de entrada, esta é uma visão geral do que acontece:Read line 1 normally
Set variables
Callgetline
, which reads line 2
Compare variablesLeia a linha 3 normalmente
Set variables
Callgetline
, which reads line 4
Compare variablesLeia a linha 5 normalmente
Set variables
Callgetline
, which reads line 6
Compare variablesObviamente, isso não vai funcionar.
-
Em segundo lugar, você cometeu um erro comum no seu código
awk
. Em código%, campos da entrada são referenciados comoawk
e as variáveis são referenciadas como$number
. Isso é diferente dos scripts de shell, onde os argumentos da linha de comando são referenciados comovariable_name
e as variáveis são referenciadas como$number
. Seu testeif ($1 != $path)
deve ser
if ($1 != path)
-
Sua abordagem geral é falha. Você não pode identificar strings que ocorrem apenas uma vez no arquivo olhando duas linhas de cada vez. Eu acredito que você pode fazer isso olhando três linhas de cada vez (isto é, mantendo as duas linhas anteriores nas variáveis), mas coisas assim ficam complicadas e bagunçadas. É provavelmente mais simples contar as ocorrências. Aqui está uma modificação mínima no seu script para fazer isso.
awk '{ if ($1 != path) { if (count == 1) { print prev } count=1 } else count++ prev=$0; path=$1 } END { if (count == 1) { print prev } }'
Eu deletei
$variable_name
, já que você nunca usou.Divulgação: Isso é essencialmente o mesmo que a última parte da resposta de Glenn.