Usando o awk / for / grep para comparar 2 arquivos

0

Eu tenho 2 arquivos csv cujo conteúdo é -

expo1.csv :

102,GREAT,adjective,ENG,p1_0,no,p2_1,no,p3,no,4,yes,p5_2,no,p6,yes....,su1,amb,su_09,no

104,BHAAG,verb,HIN,p1,yes,p2,no,p3_7,amb,p4,no,p5,no,p6_9,yes....,sg4_3,yes,su119,amb

110,.......,su11_0,amb

e impo1.csv :

104,p1,no
102,p2,yes
104,p10,no
110,su11,no

Basicamente expo1.csv é um arquivo no servidor e impo1.csv é um arquivo que criei para atualizar expo1.csv . Um script faz as alterações em expo1.csv conforme especificado em impo1.csv após executar um pequeno processamento nos dados impo1 (por exemplo, a linha 102, p2, sim de impo1.csv é processada e, em seguida, é feita uma atualização em expo1.csv - p2_1,yes .)

expo1.csv após alterações:

102,GREAT,adjective,ENG,p1_0,no,p2_1,yes,p3,no,4,yes,p5_2,no,p6,yes....,su1,amb,su_09,no

104,BHAAG,verb,HIN,p1,no,p2,no,p3_7,amb,p4,no,p5,no,p6_9,yes....,sg4_3,yes,su119,amb

110,.........,su11_0,no

Agora, depois que o script fizer as alterações, precisamos validar se as alterações são feitas adequadamente, comparando os arquivos impo1 e expo1. É aqui que estou preso.

Até agora eu pude isolar os dados entre as vírgulas em impo1.csv separadamente em variáveis usando awk :

Sno=104 102 104
Posw=p1 p2 p10
cho=no yes no

Agora a pergunta é: como faço para verificar isso? Os arquivos impo1.csv contém cerca de 3000 atualizações. Se eu grep p1 expo1.csv|grep no expo1.csv , obviamente, ele não retornará o resultado correto, pois o arquivo tem muitas cadeias 'não'. Eu tentei usar um loop for para separar os dados usando awk em variáveis separadas e, em seguida, grep usando um curinga - grep sno expo1.csv|grep '/<$posw.*,$cho>/' expo1.csv - mas não funciona.

Usando o GNU bash 4.1.2.

EDIT - Deveria ter mencionado isso antes, meu erro - Não há padrões claros no arquivo impo1.csv que eu possa usar para verificar o arquivo expo1. Fiz correções no conteúdo do arquivo de amostra que ilustram o meu ponto.

    
por Shashank K R 25.04.2017 / 11:39

2 respostas

0

A solução é bastante simples. Você só precisa criar um padrão de cada linha de impo1.csv e, em seguida, grep de expo1.csv depois de atualizado

validate() {
    # $1 ~ impo1.csv
    # $2 ~ expo1.csv after changes
    while read pattern; do
        grep -q "^$pattern" $2 || return 1
    done < <(sed "s/,/,.*/" $1 )
}
    
por 25.04.2017 / 12:21
0
awk -F, '
    NR==FNR{
        for(i=1;i<NF;i)
            DATA[$1 SUBSEP $++i] = $++i;
        next
    }
    DATA[$1 SUBSEP $2] != $3
    ' expo1.csv impo1.csv

imprimirá linhas em impo1.csv , que são diferentes dos dados em expo1.csv

    
por 25.04.2017 / 12:20

Tags