Как сравнить столбцы 2 и 3 файла 1 и столбцы 4 и 5 файла 2

Я выяснил проблему: учетные данные сеансов SSH кэшировались в моем терминале. MobaX freewareиспользовался с "save password"по умолчанию yes. Очистил хранилище паролей.

  ¯\_(ツ)_/¯  ¯\_(ツ)_/¯
1
13.09.2019, 01:05
3 ответа

Вероятно, это не самый эффективный 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.

0
28.01.2020, 00:00
#!/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
0
28.01.2020, 00:00

Вы можете сделать это следующим образом: :сначала соедините файлы вместе, затем запустите awk, чтобы отфильтровать нужные строки.

$ nf1=$(<file1 awk '{print NF;exit}') 

$ paste file1 file2 | awk -vnf1="$nf1" '$(4+nf1)<=$2 && $3<=$(5+nf1)'
0
28.01.2020, 00:00

Теги

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