내용이 다음과 같은 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, 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
그리고
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, verb, 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