
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.csv
conforme especificado em impo1.csv
apó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.csv
apó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.csv
separadamente 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.csv
arquivos 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 awk
em 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.csv
e 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.csv
diferentes dos dados emexpo1.csv