Awk массив, заменить на совпадения ключей полной длины - PullRequest
0 голосов
/ 19 января 2019

Я хочу заменить строки в целевом файле (target.txt) на строки в таблице поиска (lookup.tab), которая выглядит следующим образом.

Seq_1 Name_one
Seq_2 Name_two
Seq_3 Name_three
...
Seq_10 Name_ten
Seq_11 Name_eleven
Seq_12 Name_twelve

Файл target.txt представляет собой большой файл с древовидной структурой (формат Nexus). Это не организовано в столбцах.

Поэтому я использую следующую команду:

awk 'FNR==NR { array[$1]=$2; next } { for (i in array) gsub(i, array[i]) }1'  "lookup.tab" "target.txt"

К сожалению, эта команда не берет всю длину элементов из первого столбца, так что Seq_1, Seq_10, Seq_11, Seq_12 заканчиваются как Name_one, Name_one0, Name_one1, Name_one2 и т. Д. ...

Как сделать команду awk более точной для правильной замены строк?

1 Ответ

0 голосов
/ 19 января 2019

Попробуйте, пожалуйста, посмотрите, соответствует ли он вашим потребностям:

awk 'FNR==NR { le=length($1); a[le][$1]=$2; if (maxL<le) maxL=le; next } { for(le=maxL;le>0;le--) if(length(a[le])) for (i in a[le]) gsub(i, a[le][i]) }1'  "lookup.tab" "target.txt"

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...