Awk를 사용하여 두 파일의 5개 열 일치

Awk를 사용하여 두 파일의 5개 열 일치

두 개의 입력 파일이 있습니다.

파일 1:

s2/80   20      .       A       T       86      F=5;U=4
s2/20   10      .       G       T       90      F=5;U=4
s2/90   60      .       C       G       30      F=5;U=4

파일 2:

s2/90   60      .       G       G       97      F=5;U=4
s2/80   20      .       A       A       20      F=5;U=4
s2/15   11      .       A       A       22      F=5;U=4
s2/90   21      .       C       C       82      F=5;U=4
s2/20   10      .       G       .       99      F=5;U=4
s2/80   10      .       T       G       11      F=5;U=4
s2/90   60      .       G       T       55      F=5;U=4

예상 출력:

s2/80  20 . A   T   86  F=5;U=4  s2/80  20  . A   A   20     F=5;U=4
s2/20  10 . G   T   90  F=5;U=4  s2/20  10  . G   .   99     F=5;U=4

논리: File1과 File2의 모든 행을 출력 파일로 연결하고 싶습니다. 상황: File1과 File2의 1, 2, 4번째 열이 정확히 일치하고 File2의 5번째 열에 점, 즉 "."이 있는 경우 또는 file2의 4번째 열과 정확히 일치하는 경우입니다.

암호: 스크립트를 사용해 보았습니다.

BEGIN{}
FNR==NR{
k=$1" "$2
a[k]=$4" "$5
b[k]=$0
c[k]=$4
d[k]=$5
next
}

{ k=$1" "$2
lc=c[k]
ld=d[k]
# file1 file2
if ((k in a) && ($4==$5) && (lc==$4)) print b[k]" "$0
}

그러나 내가 얻는 결과는 다음과 같습니다.

s2/80  20 . A   T   86  F=5;U=4  s2/80  20  . A   A   20     F=5;U=4

그리고 내 결과는 다음과 같아야 합니다.

s2/80  20 . A   T   86  F=5;U=4  s2/80  20  . A   A   20     F=5;U=4
s2/20  10 . G   T   90  F=5;U=4  s2/20  10  . G   .   99     F=5;U=4

귀하의 도움에 감사드립니다. 감사해요.

답변1

awk '
    {
        key = $1 SUBSEP $2 SUBSEP $4
    }
    # here, we are reading file1
    NR == FNR {
        f1_line[key] = $0 
        next
    }
    # here, we are reading file2
    key in f1_line && ($5 == "." || $5 == $4) {
        print f1_line[key], $0
    }
' file1 file2

산출

s2/80   20      .       A       T       86      F=5;U=4 s2/80   20      .       A       A       20      F=5;U=4
s2/20   10      .       G       T       90      F=5;U=4 s2/20   10      .       G       .       99      F=5;U=4

관련 정보