Usando awk/for/grep para comparar 2 arquivos

Usando awk/for/grep para comparar 2 arquivos

Eu tenho 2 arquivos csv cujo conteúdo é-

expo1.csv:

102,ÓTIMO,adjetivo,ENG,p1_0,não,p2_1,não,p3,não,4,sim,p5_2,não,p6,sim....,su1,amb,su_09,não

104,BHAAG,verbo,HIN,p1,sim,p2,não,p3_7,amb,p4,não,p5,não,p6_9,sim....,sg4_3,sim,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 o expo1.csv. Um script faz as alterações expo1.csvconforme especificado em impo1.csvapós realizar um leve processamento nos dados impo1 (por exemplo, a linha 102,p2,yes from impo1.csvé processada e, em seguida, uma atualização é feita para expo1.csv- p2_1,yes.)

expo1.csvapós alterações:

102,ÓTIMO,adjetivo,ENG,p1_0,não,p2_1,sim,p3,não,4,sim,p5_2,não,p6,sim....,su1,amb,su_09,não

104,BHAAG,verbo,HIN,p1,não,p2,não,p3_7,amb,p4,não,p5,não,p6_9,sim....,sg4_3,sim,su119,amb

110,.........,su11_0,não

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

Até agora eu poderia isolar os dados entre as vírgulas impo1.csvseparadamente em variáveis ​​usando awk:

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

Agora a questão é: como posso verificar isso? Os impo1.csvarquivos contêm cerca de 3.000 atualizações. Se I grep p1 expo1.csv|grep no expo1.csv, obviamente não retornará o resultado correto, pois o arquivo possui muitas strings 'não'. Eu tentei usar um loop for para separar os dados awkem variáveis ​​​​separadas e depois usar o grep usando um curinga - grep sno expo1.csv|grep '/<$posw.*,$cho>/' expo1.csv- mas não funciona.

Usando GNU bash 4.1.2.

EDIT - Deveria ter mencionado isso antes, que pena - 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 meu argumento.

Responder1

A solução é bastante simples. Você só precisa criar um padrão de cada linha impo1.csve depois atualizá grep-loexpo1.csv

validate() {
    # $1 ~ impo1.csv
    # $2 ~ expo1.csv after changes
    while read pattern; do
        grep -q "^$pattern" $2 || return 1
    done < <(sed "s/,/,.*/" $1 )
}

Responder2

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 impo1.csvdiferentes dos dados emexpo1.csv

informação relacionada