Сопоставление поля первого файла на основе сопоставления шаблона во втором файле

Если я правильно помню, попробуйте использоватьifconfig:

# ifconfig [network interface] inet [address] netmask [netmask]

Вам понадобится root, поэтому сначала выполните su -.



Чтобы подписаться на сообщение @ Кусалананды , если адрес 10.1.2.3и сетевая маска 255.255.255.0на сетевом интерфейсе vio0, вы должны выполнить следующее:

# ifconfig vio0 inet 10.1.2.3 netmask 255.255.255.0

1
26.11.2020, 21:42
1 ответ

Мы могли бы проанализировать file1, сопоставить значения($2)с ключами ($1), затем проанализировать file2и добавить значение в строку, когда часть строки($3)соответствует какому-либо ключу.

BEGIN {OFS = FS = "\t"}
FNR == NR {arr[$1] = $2; next}
{for (x in arr) if ($3 ~ x) {$0 = $0 " " arr[x]; break}}
{print}

Это выводит правильные результаты для вашего примера, но это не то, что вам нужно по многим причинам. Первый из них заключается в том, что он может дать сбой в различных случаях, таких как protein_1.p1и protein_1.p11. Вторая причина - производительность, время для каждой строки файла2 не является постоянным, а ~размером file1.


Таким образом, мы должны изменить приведенный выше сценарий. Вы, вероятно, захотите определить регулярное выражение для строки белка. Таким образом, сопоставление становится достаточно строгим, а также при втором синтаксическом анализе время зависит от сопоставления регулярного выражения в поле, а не от размера массива.

BEGIN {OFS = FS = "\t"; re = "\\<protein_[[:digit:]]+.p[[:digit:]]+\\>"}
FNR == NR {if ($1 ~ re) arr[$1] = $2; next}
match($3, re) {$0 = $0 " " arr[substr($3,RSTART,RLENGTH)]}
{print}

Примечания:

  • re:"белок _", за которым следует одна или несколько цифр, ".p" и снова одна или несколько цифр. Все это внутри словесных границ. Точка буквальная. Символы слов [:alnum:]и _, поэтому остальные являются границами.
  • Также есть проверка работоспособности для 1-го поля file1.
  • Если match()найдено, то встроенные -в переменных RSTART, RLENGTHсодержат индекс и длину совпадающей строки, и эта подстрока — это то, что мы используем в хеше.

Использование:

> awk -f tst.awk file1 file2
chromosome_1    programID   transcript_id "protein_1.p1"; parent "protein_1"; note "PJD5F7, match to databaseID=64575, (species X)";
chromosome_1    programID   transcript_id "protein_1.p2"; parent "protein_1"; note "PJD5F7, match to databaseID=64575, (species X)";
chromosome_1    programID   transcript_id "protein_2.p1"; parent "protein_2"; 
chromosome_1    programID   transcript_id "protein_2.p2"; parent "protein_2"; 
chromosome_1    programID   transcript_id "protein_3.p1"; parent "protein_3"; note "PA5F9H, match to databaseID=93689, (species W)";
chromosome_1    programID   transcript_id "protein_4.p1"; parent "protein_4"; note "Q7GT5J, match to databaseID=89045, (species Y)";
chromosome_1    programID   transcript_id "protein_4.p2"; parent "protein_4"; 
chromosome_1    programID   transcript_id "protein_4.p3"; parent "protein_4"; note "YE6G3L, match to databaseID=44968, (species Z)";
1
18.03.2021, 22:47

Теги

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