
내용이 다음과 같은 2개의 CSV 파일이 있습니다.
expo1.csv
:
102,GREAT,형용사,ENG,p1_0,no,p2_1,no,p3,no,4,yes,p5_2,no,p6,yes...,su1,amb,su_09,no
104,BHAAG,동사,HIN,p1,yes,p2,no,p3_7,amb,p4,no,p5,no,p6_9,yes...,sg4_3,yes,su119,amb
110,.......,su11_0,amb
그리고
impo1.csv
:
104,p1,no
102,p2,yes
104,p10,no
110,su11,no
기본적으로 expo1.csv
는 서버에 있는 파일이고, impo1.csv
업데이트를 위해 제가 만든 파일입니다 expo1.csv
. 스크립트는 impo1 데이터에서 약간의 처리를 수행한 후 expo1.csv
에 지정된 대로 변경합니다 (예: 102,p2,yes 행이 처리된 다음 - 가 업데이트됩니다 .)impo1.csv
impo1.csv
expo1.csv
p2_1,yes
expo1.csv
변경 후:
102,GREAT,형용사,ENG,p1_0,no,p2_1,yes,p3,no,4,yes,p5_2,no,p6,yes...,su1,amb,su_09,no
104,BHAAG,동사,HIN,p1,no,p2,no,p3_7,amb,p4,no,p5,no,p6_9,yes...,sg4_3,yes,su119,amb
110,........,su11_0,아니요
이제 스크립트가 변경을 수행한 후 impo1 및 expo1 파일을 비교하여 변경이 제대로 수행되었는지 검증해야 합니다. 이것이 내가 붙어있는 곳입니다.
지금까지 다음을 사용하여 쉼표 사이의 데이터를 impo1.csv
개별적으로 변수로 분리할 수 있었습니다 awk
.
Sno=104 102 104
Posw=p1 p2 p10
cho=no yes no
이제 문제는 이것을 어떻게 확인하는가입니다. 파일 impo1.csv
에는 약 3000개의 업데이트가 포함되어 있습니다. I 인 경우 grep p1 expo1.csv|grep no expo1.csv
파일에 'no' 문자열이 많기 때문에 올바른 결과를 반환하지 않을 것입니다. for 루프를 사용하여 데이터를 awk
별도의 변수로 분리한 다음 와일드카드를 사용하여 grep을 시도했지만 grep sno expo1.csv|grep '/<$posw.*,$cho>/' expo1.csv
작동하지 않습니다.
GNU bash 사용 4.1.2.
편집 - 이것을 더 일찍 언급했어야 했는데, 내 잘못은 - expo1 파일을 확인하는 데 사용할 수 있는 impo1.csv 파일에 명확한 패턴이 없습니다. 내 요점을 설명하는 샘플 파일 내용을 수정했습니다.
답변1
해결책은 다소 간단합니다. 각 라인에서 패턴을 생성 impo1.csv
한 다음 업데이트된 이후 grep
부터 패턴을 생성하면 됩니다.expo1.csv
validate() {
# $1 ~ impo1.csv
# $2 ~ expo1.csv after changes
while read pattern; do
grep -q "^$pattern" $2 || return 1
done < <(sed "s/,/,.*/" $1 )
}
답변2
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
impo1.csv
데이터와 다른 행을 인쇄합니다 .expo1.csv