마지막 열의 값을 기준으로 두 파일을 비교합니다.

마지막 열의 값을 기준으로 두 파일을 비교합니다.

두 개의 파일이 있는데 각 파일에는 여러 개의 열이 있고 행 번호가 같지 않습니다. 두 파일의 세 번째 열을 읽고 동일한지 확인한 다음 두 파일의 네 번째 열을 비교하여 최대 수와 세 번째 파일의 전체 줄을 인쇄합니다. 다른 파일에서 찾을 수 없는 행의 경우에도 이를 가장 높은 숫자로 사용하십시오.

파일 A

a b c 10
d e f 11
g h i 15
j k l 15
p l m 35

플라이B

d e f 15
j k l 20
w x z 40

원하는 출력

파일C

a b c 10
d e f 15
g h i 15
j k l 20
p l m 35
w x z 40

답변1

이와 같이:

awk '$4>n[$3]{n[$3]=$4;l[$3]=$0}END{for(i in l)print l[i]}' file_a file_b > file_c

설명: 네 번째 열이 n동일한 세 번째 열(배열에 있음)에 대해 기억된 최대값보다 큰 경우 새 네 번째 열과 l해당 세 번째 열(배열에 있음)의 전체 행이 기억됩니다. 마지막으로 기억된 모든 줄을 인쇄합니다.

답변2

$ cat fileA fileB | sort -k3,3 -k4,4nr | sort -k3,3 -u
a b c 10
d e f 15
g h i 15
j k l 20
p l m 35
w x z 40

이는 세 부분으로 구성된 파이프라인입니다.

  1. fileA와 연결하다 fileB.
  2. 세 번째 열의 각 고유 값에 대해 연결된 파일을 네 번째 열을 기준으로 숫자 내림차순으로 정렬합니다. 이 단계의 결과는

    a b c 10
    d e f 15
    d e f 11
    g h i 15
    j k l 20
    j k l 15
    p l m 35
    w x z 40
    
  3. 다시 정렬하되 중복 항목을 제거하고 세 번째 열만 정렬 키로 사용합니다. 이렇게 하면 정렬 키의 첫 번째 발견 인스턴스가 있는 행이 유지되지만 중복 정렬 키가 있는 행은 삭제됩니다(네 번째 열의 값은 다음과 같습니다.첫 번째sort), 우리가 원하는 결과를 얻을 것입니다.

이 방법은 처음 두 열의 내용을 완전히 무시합니다.

답변3

awk 인터프리터가 /usr/bin/에 있는 경우:

cat doit.awk

#!/usr/bin/awk

NF!=4 {

    print "Field number must be 4" > "/dev/stderr";
    exit 1;
}

FILENAME=="file_a" {

    i++;
    numval_a[i]=$4;
    letters_a[i]=$1FS$2FS$3;
}

FILENAME=="file_b" {

    k++;
    numval_b[k]=$4;
    letters_b[k]=$1FS$2FS$3;
}

END {

    for(j=1; j<=i; j++) {

        if(letters_a[j]!=letters_b[j]) {

            print "Line missmatch!" > "/dev/stderr";
            exit 2;
        }

        if(numval_a[j]>numval_b[j])
            max=numval_a[j];
        else
            max=numval_b[j];

        print letters_a[j], max;
    }
}

awk -f doit.awk file_a file_b

a b c 10
d e f 15
g h i 20
j k l 25

관련 정보