두 파일 비교를 위해 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,동사,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,동사,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

관련 정보