Awk从另一个数组创建一个新的唯一值数组

Awk从另一个数组创建一个新的唯一值数组,awk,Awk,我有我的阵列: array = [1:"PLCH2", 2:"PLCH1", 3:"PLCH2"] 我想在array上循环,以创建唯一值的新数组unique,并获得: unique = [1:"PLCH2", 2:"PLCH1"] 我怎样才能做到这一点 编辑:根据@Ed Morton的请求,我在下面展示了我的数组是如何填充的。事实上,这篇文章是我上一篇文章的关键解决方案 在我的文件.txt中,我有: PLCH2:A1007int&PLCH1:D987int&PLCH2:P97

我有我的阵列:

array = [1:"PLCH2", 2:"PLCH1", 3:"PLCH2"]
我想在
array
上循环,以创建唯一值的新数组
unique
,并获得:

unique = [1:"PLCH2", 2:"PLCH1"]
我怎样才能做到这一点

编辑:根据@Ed Morton的请求,我在下面展示了我的数组是如何填充的。事实上,这篇文章是我上一篇文章的关键解决方案

在我的
文件.txt
中,我有:

PLCH2:A1007int&PLCH1:D987int&PLCH2:P977L
INTS11:P446P&INTS11:P449P&INTS11:P518P&INTS11:P547P&INTS11:P553P
我使用split获得
数组

awk '{
    split($0,a,"&")
    for ( i in a ) {
        split(a[i], b, ":");
        array[i] = b[1];
    }
}' file.txt

这可能就是你想要做的:

$ cat tst.awk
BEGIN {
    split("PLCH2 PLCH1 PLCH2",array)

    printf "array ="
    for (i=1; i in array; i++) {
        printf " %s:\"%s\"", i, array[i]
    }
    print ""

    for (i=1; i in array; i++) {
        if ( !seen[array[i]]++ ) {
            unique[++j] = array[i]
        }
    }

    printf "unique ="
    for (i=1; i in unique; i++) {
        printf " %s:\"%s\"", i, unique[i]
    }
    print ""
}

$ awk -f tst.awk
array = 1:"PLCH2" 2:"PLCH1" 3:"PLCH2"
unique = 1:"PLCH2" 2:"PLCH1"

编辑:根据您最新的问题,以下是我真正的做法:

$ cat tst.awk
BEGIN { FS="[:&]" }
{
    numVals=0
    for (i=1; i<NF; i+=2) {
        vals[++numVals] = $i
    }

    print "vals =" arr2str(vals)

    delete seen
    numUniq=0
    for (i=1; i<=numVals; i++) {
        if ( !seen[vals[i]]++ ) {
            uniq[++numUniq] = vals[i]
        }
    }

    print "uniq =" arr2str(uniq)
}

function arr2str(arr,    str, i) {
    for (i=1; i in arr; i++) {
        str = str sprintf(" %s:\"%s\"", i, arr[i])
    }
    return str
}

$ awk -f tst.awk file
vals = 1:"PLCH2" 2:"PLCH1" 3:"PLCH2"
uniq = 1:"PLCH2" 2:"PLCH1"
vals = 1:"INTS11" 2:"INTS11" 3:"INTS11" 4:"INTS11" 5:"INTS11"
uniq = 1:"INTS11" 2:"PLCH1"
$cat tst.awk
开始{FS=“[:&]”
{
numVals=0

对于(i=1;i),我希望您的问题包括一个显示当前数组填充方式的小而完整的脚本,因为到目前为止您发布的内容可以以几种不同的方式进行解释。
for(a中的i)
将把您的值重新排列为随机(散列)顺序。这通常是不可取的,这就是为什么我使用
for(a中的i=1;i++)
相反,我要确保访问数组索引的顺序与它们在拆分为数组的字符串中出现的顺序相同。请参见。@EdMorton哇,我不知道,感谢您解释了循环中的不同之处感谢您提出了一个答案,我将尝试一下,然后再回到这个问题。顺便问一句,
看到了
函数吗?不,
看到了[]
只是一个数组的名称,我使用该数组将
数组[]中的值存储为索引,这样我就可以确定这些值中的哪些值以前被它的关联计数看到过,是零还是非零(我在
if
中使用的是false还是true)。
seen[]
可以被命名为任何名称,但这是用于该目的的数组的惯用名称。@Zen在我在队列中看到它之前,其他人已经拒绝了它,但它仍然存在一些问题,因此我刚刚发布了如何使用您提供的从文件读取的示例输入来真正做到这一点。