awk/for/grep을 사용하여 두 파일 비교

awk/for/grep을 사용하여 두 파일 비교

내용이 다음과 같은 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.csvimpo1.csvexpo1.csvp2_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

관련 정보