AWK从数组中获取唯一元素

时间:2020-02-05 16:37:30

标签: awk

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

问题是我不知道如何从数组中获取唯一值。我找到了这个question,但它谈论的是文件而不是像我这样的数组。

代码:

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

我希望获得类似的信息(注意那里有&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

编辑:

我的问题得到了部分解决,这要归功于Pierre Francois的回答SUBSEP。我的另一个问题是,我只想从数组geneskeys中获取唯一元素。

谢谢。

1 个答案:

答案 0 :(得分:1)

假设您要删除与 awk join 函数串联的字段之间的空格,这是您必须为 join 提供的第四个参数。 em>函数是幻数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