find -xdev
не спускается в каталоги, являющиеся точками монтирования, но по-прежнему перечисляет их. Попробуйте find / -xdev -maxdepth 2
, вы увидите, что /dev
, /proc
, /sys
и любые другие точки монтирования перечислены, но их содержимое отсутствует.
Я думаю, причина в том, что точка монтирования присутствует в родительской файловой системе, даже несмотря на то, что find
перечисляет корень смонтированной файловой системы, а не каталог, который служит точкой монтирования.
Не существует удобного способа пропустить точки монтирования. Если вы выполняете пост-обработку -, вы можете убедиться, что они находятся на том же устройстве, что и корень обхода, сравнив вывод df -P
илиstat -c %d
(в Linux ). Но это довольно много накладных расходов для редкой ситуации.
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
Позже вы можете удалить эхо "Проверка $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..
Вероятно, проще сделать это в 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
Прогулка по awk
...... Вы знаете, какие строки в file3
пришли из file1
, потому что в них всего 3 поля, в 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
агностическим.