Я выяснил проблему: учетные данные сеансов SSH кэшировались в моем терминале. MobaX freeware
использовался с "save password"
по умолчанию yes
. Очистил хранилище паролей.
¯\_(ツ)_/¯ ¯\_(ツ)_/¯
Вероятно, это не самый эффективный awk
скрипт:
awk '{
if (NR==FNR) {
l[NR]=$0
a[NR]=$2
b[NR]=$3
}
else if (a[FNR]>=$4 && b[FNR]<=$5) {
print l[FNR],$0
}
}' file1 file2 > newfile
Когда будет прочитан первый файл (NR==FNR
), сохраните всю строку $0
и поля $2
и $3
в массивах по индексуNR
(номер записи ). Когда второй файл будет прочитан, сравните значения в массиве a
и b
по заданному индексуFNR
(номер записи файла )с полями $4
и $5
.
Если значения массива находятся в диапазоне, вывести старую строку и текущую строку. Вывод записывается в новый файл newfile
.
#!/usr/bin/perl
use strict;
my $f1=shift;
open(F1,"<",$f1) || die "Couldn't open $f1: $!\n";
my $f2=shift;
open(F2,"<",$f2) || die "Couldn't open $f2: $!\n";
until (eof(F1) || eof(F2)) {
my @a = split /\t/,<F1>;
my @b = split /\t/,<F2>;
chomp($a[@a-1]);
# note: perl arrays start from 0, not 1
print join("\t",@a, @b) if (($a[1] >= $b[3]) && ($a[2] <= $b[4]));
}
Это открывает два аргумента имени файла, поскольку файл -обрабатывает F1
и F2
соответственно. Если какой-либо файл не открывается, он завершается с сообщением об ошибке.
Затем, пока ни один из них не достиг EOF (конца -файла -), он:
считывает строку за раз из каждого дескриптора файла -в отдельные массивы(@a
для F1 и @b
для F2 ).
Функция chomp()
удаляет завершающий символ новой строки(\n
)из последнего элемента массива @a
, чтобы предотвратить появление новой строки в середине любых выходных строк, где массивы соединяются.
Если массивы соответствуют вашим критериям ($a[1]>=$b[3] и $a[2]<=$b[4] ), он печатает оба массива как одну строку вывода., соединенные табуляцией в качестве разделителей полей.
Сохранить как, например. ibk.pl
, сделайте его исполняемым с помощью chmod +x ibk.pl
и запустите как:
$./ibk.pl file1 file2
NC_025345 11996 12085 KX932454.2 NC_025345.1 RefSeq gene 10337 16933 . + . ID=gene-NZ82_gp6;Dbxref=GeneID:20964336;Name=NZ82_gp6;gbkey=Gene;gene_biotype=protein_coding;locus_tag=NZ82_gp6
Вы можете сделать это следующим образом: :сначала соедините файлы вместе, затем запустите awk, чтобы отфильтровать нужные строки.
$ nf1=$(<file1 awk '{print NF;exit}')
$ paste file1 file2 | awk -vnf1="$nf1" '$(4+nf1)<=$2 && $3<=$(5+nf1)'