Considere os seguintes arquivos:
file1
:
boo,8,1024
foo,7,2048
file2
:
foo,0,24,154
noo,0,10,561
file3
:
24,154,7,1024,0
O que eu preciso é ir para o Arquivo1 e verificar se $2==7
; se for verdade, tomar $1
, $2
e $3
de File1 ; agora eu tenho que comparar se $1
de File1 igual a $1
de File2 ; se for verdade, eu tenho que tomar $3
e $4
de File2 que não existem em File1 , então eu tenho que ir para File3 e verifique se $1
a partir File3 é igual a $3
de File2 , e $2
de File3 é igual a $4
de File2 ; se sim, então eu tenho que verificar se $2
do arquivo1é igual a $3
do arquivo3 , se essa condição for verdadeira, tenho que comparar $3
do arquivo1 com $4
do arquivo3 , se $3
do arquivo1 for mais do que $4
do arquivo3 .
Eu tentei o seguinte script:
cat [file1] [file2] [file3] |
awk -F,
'{if(NF==3)
{if($2==7){a[$1]=$1; b[$1]=$2; c[$1]=$3}
}else
{if(NF==4){if(a[$1]==$1){d[$3]=$3; e[$4]=$4}
}else
{if(NF==5){if(d[$1]==$1 && e[$2]==$2){print a[$1], b[$1], c[$1], d[$1]}}
}
}
}'
A saída desejada é:
foo,7,2048,24,154,1024
text-processing
awk
gawk
Eng7
fonte
fonte
Solução TXR:
Corre:
Mas o observador astuto notará que o 7 não foi especificado em nenhum lugar do código, aparecendo apenas na saída! Isso ocorre porque o código está marcando todos os registros
file1
e imprime todas as combinações que atendem às correspondências e restrições . A única nos dados da amostra é aquele comval0
ser7
.Se houvesse mais combinações encontradas, poderia ser restrito a
7
uma dessas:A linguagem de extração de padrões TXR fornece aqui uma grande correspondência de padrões com referências remotas implícitas através da repetição de nomes de variáveis, abrangendo vários arquivos, com padrões de extração de várias linhas e restrições não textuais, além de efeitos colaterais incorporados, como saída, etc. .
A solução Awk aceita traduziu cuidadosamente a
awk
macro TXR Lisp :Corre:
A
,1024
parte necessária na saída está ausente; o original "Awk Classic" tem esse comportamento.fonte