Awk получить уникальные элементы из массива - PullRequest
0 голосов
/ 05 февраля 2020

file.txt:

INTS11:P446P&INTS11:P449P&INTS11:P518P&INTS11:P547P&INTS11:P553P
PLCH2:A1007int&PLCH1:D987int&PLCH2:P977L

Я пытаюсь создать гиперссылку путем преобразования содержимого файла. Гиперссылка будет иметь следующий стиль:

somelink&gene=<gene>[&gene=<gene>]&mutation=<gene:key>[&mutation=<gene:key>]

, где INTS11:P446P соответствует gene:key, например

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

Моя попытка состоит в следующем

  1. Разделить на & и сохранить в a
  2. Для каждого элемента в a, разделить на : и добавить a[i] в массив b

Проблема в том, что я не знаю Как получить уникальные значения из моего массива. Я нашел этот вопрос , но он говорит о файлах, а не массивах, как в моем случае.

Код:

awk '@include "join"
    {
    split($0,a,"&")
    for ( i = 1; i <= length(a); i++ ) {
        split(a[i], b, ":");
        genes[i] = "&gene="b[1];
        keys[i] = "&mutation="b[1]":"b[2]
    }
    print "somelink"join(genes, 1, length(genes),SUBSEP)join(keys, 1, length(keys),SUBSEP)
    delete genes
    delete keys
}' file.txt

выведет:

somelink&gene=INTS11&gene=INTS11&gene=INTS11&gene=INTS11&gene=INTS11&mutation=INTS11:P446P&mutation=INTS11:P449P&mutation=INTS11:P518P&mutation=INTS11:P547P&mutation=INTS11:P553P
somelink&gene=PLCH2&gene=PLCH1&gene=PLCH2&mutation=PLCH2:A1007int&mutation=PLCH1:D987int &mutation=PLCH2:P977L

Я буду sh, чтобы получить что-то подобное (обратите внимание, сколько &gene= есть):

somelink&gene=INTS11&mutation=INTS11:P446P&INTS11:P449P&INTS11:P518P&INTS11:P547P&INTS11:P553P
somelink&gene=PLCH2&gene=PLCH1&mutation=PLCH2:A1007int&mutation=PLCH1:D987int&mutation=PLCH2:P977L

РЕДАКТИРОВАТЬ:

моя проблема была частично решена благодаря решению Пьера Франсуа ответ, который был SUBSEP. Другая моя проблема в том, что я хочу получать только уникальные элементы из моих массивов genes и keys.

Спасибо.

1 Ответ

1 голос
/ 07 февраля 2020

Предположим, вы хотите удалить пробелы между полями, объединенными с помощью функции join awk , 4-й аргумент, который вы должны предоставить функции join это маги c число SUBSEP, а не пустая строка "", как вы это сделали. Попробуйте:

awk '@include "join"
    {
    split($0,a,"&")
    for ( i = 1; i <= length(a); i++ ) {
        split(a[i], b, ":");
        genes[i] = "&gene="b[1];
        keys[i] = "&mutation="b[1]":"b[2]
    }
    print "somelink"join(genes, 1, length(genes),SUBSEP)join(keys, 1, length(keys),SUBSEP)
    delete genes
    delete keys
}' file.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...