두 개의 tsv 파일을 비교하려고합니다. 쿼리할 파일(file1)은 다음과 같습니다.
Chr Start End
chr1 234738546 234738934
chr1 234792654 234793537
chr1 234908151 234908864
chr1 235097868 235098170
chr1 236080566 236081347
chr1 240307621 240308262
chr1 240308207 240308637
chr1 240308546 240308962
chr1 242627058 242627262
chr1 243923195 243923709
다른 파일(file2)의 두 번째 열에는 확인하려는 숫자가 열 2와 열 3의 숫자 사이에 있는지 확인하고 조건이 충족될 때까지 반복합니다.
예: & 242627060
사이242627058
242627262
파일 2는 다음과 같습니다.
Chr Centre_Coord Ignore_this_col Secondary Information
chr1 234765055 234765056 NR_033927_LINC00184 . +
chr1 234782033 234782034 NR_125944_LOC101927787 . +
chr1 234859787 234859788 NR_038856_LINC01132 . +
chr1 234895802 234895803 NR_148962_PP2672 . -
chr1 235099745 235099746 NR_125945_LOC101927851 . -
chr1 235324564 235324565 NR_144491_RBM34 . -
chr1 235097888 235291252 NR_002956_SNORA14B . -
chr1 235097869 235353431 NR_039908_MIR4753 . -
chr1 235324564 235324565 NR_027762_RBM34 . -
chr1 235324564 235324565 NM_001346738_RBM34 . -
나에게 다음과 같은 결과를 제공합니다.
chr1:242627058-242627262, 242627060
-
분리된 좌표의 출처는 쉼표 file1
로 두 번째 열로 구분됩니다 file2
.
while 루프를 사용해 보았지만 awk
어떤 이유로든 사용할 수 없습니다.
while read a b c; do col2=$b; col3=$3; tail -n +1 path/to/file2 | awk 'BEGIN{OFS="\t"}{if($2>=$col2 && $2<=$col3) {print $a,$col2,$col3,$2}; break; else continue}' > rohit_TSS.txt; done < file1
답변1
이 작업은 두 단계로 수행하는 것이 더 쉬울 수 있습니다.
모든 것을 보조 파일에 넣고 정렬하십시오.
awk 'FNR>1{print $1, $2, $3, $4 }' file1 file2 | sort -k1 >> file3
awk
그런 다음 모두 한 번만 반복하십시오.
awk '{if (NF == 3) {chr=$1; lo=$2; hi=$3} else { if ($1==chr && $2>=lo && $2<=hi) print $1":"lo"-"hi", "$2}}' file3
살펴보니 ... 필드가 3개뿐이고 더 많은 행이 있기 때문에 awk
어떤 행에서 나오는지 알 수 있습니다 .file3
file1
file2
if (NF == 3) {chr=$1; lo=$2; hi=$3}
file3
이 테스트는 당신이 에서 라인(인)에 있을 때 적용됩니다 file1
. 해당 시점부터 행을 찾을 때마다 합계 값과 현재 염색체를 file1
얻고 싶습니다.lo
hi
else
그렇지 않으면 우리는 단지 한 줄에 있을 것입니다 file2
...
if ($1==chr && $2>=lo && $2<=hi) print $1":"lo"-"hi", "$2}
우리가 동일한 염색체에 있고 관심 값이 $2
이전에 기억한 값 lo
과 한계 사이에 있는 경우 귀하의 형식으로 인쇄됩니다.hi
출력은 다음과 같습니다
chr1:235097868-235098170, 235097869
chr1:235097868-235098170, 235097888
노트
사실 당신은 처음 awk
이자 유일한 것을 잊어버릴 수 있어요
cat file1 file2 | sort > file3
전체 줄을 정렬하므로 chr
불가지론적이어야 합니다.
답변2
for C in `cat file2 |awk -F" " '{ print $2 }' ` ; do
echo "Checking $C .." ;
cat file1 | awk -v var=$C -F" " '{ if ( var >=$2 && var <=$3 ) print $1":"$2"-"$3", "var ; }';
done
나중에 echo "Checking $C .." 를 제거할 수 있습니다.
Checking 234765055 ..
Checking 234782033 ..
Checking 234859787 ..
Checking 234895802 ..
Checking 235099745 ..
Checking 235324564 ..
Checking 235097888 ..
chr1:235097868-235098170, 235097888
Checking 235097869 ..
chr1:235097868-235098170, 235097869
Checking 235324564 ..
Checking 235324564 ..