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
예
이는 sed
StackExchange 출력 형식을 지정하기 위한 것입니다!
$ 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