
두 개의 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
File2는 다음과 같습니다.
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
아마도 2단계로 수행하는 것이 더 쉬울 것입니다.
모든 것을 도우미 파일에 넣고 정렬하세요.
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
는 에서 온 라인(in)에 있을 때 참인 테스트입니다 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 "$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 ..