Awk - 각 행의 여러 열을 이전 행과 비교합니다.

Awk - 각 행의 여러 열을 이전 행과 비교합니다.

나는 이것을 여러 번 시도했지만 분명히 뭔가 빠졌고 도움이 필요합니다.

수천 개의 정보 행이 포함된 큰 테이블이 있고 이를 3, 4, 6열을 기준으로 정렬하려고 합니다. 이 열을 기준으로 행을 정렬했으며 이제 다음을 수행하려고 합니다.

열 3 = 이전 행, 열 3 && 열 4 < 이전 행, 열 5 && 열 6 = 이전 행, 열 6은 해당 행을 인쇄하지만 일치하는 행 번호가 처음 발생하면 시작을 수정합니다. 줄이지만 현재 줄 번호의 시작 부분을 수정합니다.

오류로 가득 찬 나의 잘못된 접근 방식은 다음과 같습니다.

awk -F, 'BEGIN { OFS = FS } {if ($4<prev5 && $3==prev3 && $6==prev6) print Marker,$0;else Marker=NR print NR,$0; prev5=$5; prev3=$3; prev6=$6}'

입력 예(보기 쉽게 쉼표로 구분):

a,b,2,15,50,ABBA    
a,a,2,26,55,ABBA    
b,a,2,80,99,ABA    
c,a,3,20,40,CAN    
a,b,3,51,300.CAN    
a,a,4,1000,2000,ART   
d,c,4,1700,2050,ART    
b,a,4,1800,2051,ART

출력 예:

1,a,b,2,15,50,ABBA    
1,a,a,2,26,55,ABBA    
3,b,a,2,80,99,ABA    
4,c,a,3,20,40,CAN    
5,a,b,3,51,300.CAN    
6,a,4,1000,2000,ART   
6,c,4,1700,2050,ART    
6,b,a,4,1800,2051,ART   

주어진 기준에 따라 행을 그룹화하여 그룹 식별자가 행 번호 방법을 사용할 필요가 없도록 하고 싶습니다. 이를 수행하는 더 좋은 방법이 있다면 제안하겠습니다.

나는 항상 내가 알고 있는 기본 코드를 개선하고 싶어하기 때문에 누군가가 이 문제를 도와줄 수 있기를 바랍니다. 가능하다면 설명을 제공해 주시고 내 실수로부터 배우고 싶습니다!

답변1

코드를 여러 줄에 걸쳐 펼치면 코드를 더 읽기 쉽게 만들 수 있습니다.

awk -F, '
    BEGIN { OFS = FS }

    # Each line
    {
        if($3 == prev[3] && $4 < prev[5] && $6 == prev[6])
        {
            # Capture and use record number of last match
            if(!nrMatched) { nrMatched = NR-1 }
            print nrMatched, $0
        }
        else
        {
            # No match, reset matched flag and just copy record through
            nrMatched = 0
            print NR, $0
        }

        # Save fields from this line for next comparison
        split($0, prev)
    }
' datafile

산출

1,a,b,2,15,50,ABBA
1,a,a,2,26,55,ABBA
3,b,a,2,80,99,ABA
4,c,a,3,20,40,CAN
5,a,b,3,51,300.CAN
6,a,a,4,1000,2000,ART
6,d,c,4,1700,2050,ART
6,b,a,4,1800,2051,ART

관련 정보