Awk 및 Bash를 사용하여 5개 필드를 기반으로 파일을 비교합니다.

Awk 및 Bash를 사용하여 5개 필드를 기반으로 파일을 비교합니다.

5개의 필드(열 1, 2, 4, 5, 6)를 사용하여 File1과 File2(공백으로 구분)를 비교하고 싶습니다.

*논리:*File1과 File2의 열 1과 2가 정확하게 일치하고 File2에 file1의 열 4와 5에 있는 문자와 동일한 문자가 있는 경우 file1과 file2의 해당 행이 연결되어 출력으로 리디렉션됩니다.

파일 1:

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

파일 2:

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

산출:

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

저는 이 분야를 처음 접했고 어떤 안내라도 감사하겠습니다.

답변1

다음은 awk다음 코드를 다음 코드를 사용하는 파일 입니다 ex.awk.

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) || (ld==$5)) print b[k]" "$0
}

그런 다음 위의 두 파일을 사용하여 실행하십시오.

$ awk -f ex.awk file1 file2

이는 sedStackExchange 출력 형식을 지정하기 위한 것입니다!

$ awk -f ex.awk file1 file2 | sed 's/[ ]\+/  /g'
s2/90  60  .  C  G  30  N=2  F=5;U=4  s2/90  60  .  G  G  97  N=2  F=5;U=4
s2/80  20  .  A  T  86  N=2  F=5;U=4  s2/80  20  .  A  A  20  N=2  F=5;U=4
s2/20  10  .  G  T  90  N=2  F=5;U=4  s2/20  10  .  G  G  99  N=2  F=5;U=4

요구사항 변경

file1아래 설명에서 OP는 열 4와 5가 열 4와 5와 일치하는 행을 삭제 하는 최종 솔루션을 원한다고 언급했습니다 file2.

예를 들어 file1& 에 다음 줄을 추가하세요 file2.

s2/40   40      .       S       S       90      N=2     F=5;U=4

원래 솔루션에 한 줄을 추가하면 요구 사항의 특정 변경 사항이 해결됩니다.

if ((k in a) && (lc==$4) && (ld==$5)) next

새로운 예

ex2.awk:

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]
  if ((k in a) && (lc==$4) && (ld==$5)) next
  if ((k in a) && ($4==$5) && (lc==$4) || (ld==$5)) print b[k]" "$0
}

awk스크립트를 다시 실행합니다 ex2.awk.

$ awk -f ex2.awk file1 file2 | sed 's/[ ]\+/  /g'
s2/90  60  .  C  G  30  N=2  F=5;U=4  s2/90  60  .  G  G  97  N=2  F=5;U=4
s2/80  20  .  A  T  86  N=2  F=5;U=4  s2/80  20  .  A  A  20  N=2  F=5;U=4
s2/20  10  .  G  T  90  N=2  F=5;U=4  s2/20  10  .  G  G  99  N=2  F=5;U=4

관련 정보