Если вы укажете путь к файлу, ваш сценарий уже будет работать правильно.
Если вы не хотите указывать путь, вы можете проверить наличие файла в другом каталоге, просто указав этот путь в своем скрипте
if [ -f "/other/dir/$num3" ]
then
echo "It is valid script"
else
echo "Invalid file name"
fi
# save this as script.awk or whatevernameyouwant.awk
function within_range(val, lower, upper, proximity) {
# you can specify the "proximity" as required
return val > lower - proximity && val < upper + proximity
}
BEGIN {
OFS="\t"
}
$1 == id && within_range(pos, $4, $5, 100) {
name = gensub(/.*Name=([^\t]*).*/, "\\1", 1)
if (name ~ /[^[:space:]]+/)
print id, pos, name
}
Затем запустите
while read -r id pos
do
awk -v id=$id -v pos=$pos -f script.awk file_a.tsv
done < file_b.tsv > output.tsv
Пожалуйста, убедитесь, что поля в ваших .tsv
файлах разделены символами табуляции перед их обработкой. Мой вывод:
MT 4050 mt-nd2
groupIII 7332350 si:dkeyp-68b7.10
groupIV 5347350 zgc:153018
groupVI 11230375 bnip4
groupVII 17978350 si:ch211-284e13.4
Для ID MT
попадание в ген должно быть mt-nd2
, а не mt-nd1
.
Я по-прежнему рекомендую использовать Python для обработки данных.
Ваш ожидаемый показанный результат не кажется мне согласованным (2 строки --> 1-я и 3-я ), если это опечатка, не могли бы вы попробовать выполнить следующее.
awk 'FNR==NR{a[$1]=$2;next} ($1 in a) && (a[$1]>=$4 && a[$1]<=$5){sub("Name=","",$10);print $1,a[$1],$10}' b.tsv a.tsv > output.tsv