2개의 주석 파일에서 3개의 열을 일치시키고 해당 행을 새 출력 파일에 인쇄합니다.

2개의 주석 파일에서 3개의 열을 일치시키고 해당 행을 새 출력 파일에 인쇄합니다.

2개의 파일이 있는데 파일 1과 파일 2의 열 번호가 동일합니다. 첫 번째 열에는 염색체 번호가 있고, 두 번째 열에는 프로모터 시작 사이트가 있으며, 세 번째 열에는 프로모터 중지 사이트가 있습니다.

파일 1의 세 열 모두에 대해 파일 2에서 일치하는 항목이 발견되면 두 파일을 모두 일치시키고 싶습니다. 정확히 3개와 4개의 열을 표시하는 출력 파일을 생성하고 싶습니다. 네 번째에는 점수가 1인 일치 항목과 점수가 0인 불일치 항목이 표시됩니다.

파일 1:

chr1 899 1098
chr3 677 900
chr3 844 1045

파일 2:

chr3 844 1045
chr1 899 1098
chr4 500 789

결과물 파일:

chr1 899 1098  1
chr3 677 900   0
chr3 844 1045  1
chr4 500 789   0

파일과 일치하는 답변을 찾았고 동일한 포럼에서 새 파일을 출력했습니다.

awk 'FNR==NR{a[$1,$2,$3]=$0;next}{if(b=a[$1,$2,$3]){print b}}' file1 file2

하지만 출력 파일에 일치 및 불일치 점수 열도 포함하고 싶습니다.

답변1

스크립트

#!/bin/bash
filea=$1
fileb=$2
fout=$3
sed -i "/^$/d" $filea $fileb
cat $filea | while read a b c
  do
    grep "$a.*$b.*$c" $fileb &>/dev/null && l="$a   $b  $c  1" || l="$a $b  $c  0"
    grep "$l" $fout &>/dev/null || echo "$l" >> $fout
  done
cat $fileb | while read a b c
  do
    grep "$a.*$b.*$c" $filea $fout &>/dev/null && l="$a $b  $c  1" || l="$a $b  $c  0"
    grep "$l" $fout &>/dev/null || echo "$l" >> $fout
  done

표준 출력

younes@cbfcdf:~$ cat filea
chr1 899 1098
chr3 677 900
chr3 844 1045
younes@cbfcdf:~$ cat fileb
chr3 844 1045
chr1 899 1098
chr4 500 789
younes@cbfcdf:~$ ./script filea fileb new_file
younes@cbfcdf:~$ cat new_file 
chr1    899     1098    1
chr3    677     900     0
chr3    844     1045    1
chr4    500     789     0
younes@cbfcdf:~$

관련 정보