Сравнение двух tsv-файлов

find -xdev не спускается в каталоги, являющиеся точками монтирования, но по-прежнему перечисляет их. Попробуйте find / -xdev -maxdepth 2, вы увидите, что /dev, /proc, /sysи любые другие точки монтирования перечислены, но их содержимое отсутствует.

Я думаю, причина в том, что точка монтирования присутствует в родительской файловой системе, даже несмотря на то, что findперечисляет корень смонтированной файловой системы, а не каталог, который служит точкой монтирования.

Не существует удобного способа пропустить точки монтирования. Если вы выполняете пост-обработку -, вы можете убедиться, что они находятся на том же устройстве, что и корень обхода, сравнив вывод df -Pилиstat -c %d(в Linux ). Но это довольно много накладных расходов для редкой ситуации.

1
25.11.2019, 17:55
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

Позже вы можете удалить эхо "Проверка $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
28.01.2020, 02:12

Вероятно, проще сделать это в 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агностическим.

0
28.01.2020, 02:12

Теги

Похожие вопросы