删除给定列中的重复字段(经过 ID 检查)

dov*_*vah 3 text-processing

我想从给定的列(示例中的 $2)中删除重复的字段(逗号分隔),但前提是 ID 列(示例中的 $1)相同。

输入:

A    1,2,3,4
A    8,9,10,11
A    2,3,4,11,12
B    4,5,6,7
B    6,8,9,10
Run Code Online (Sandbox Code Playgroud)

预期输出:

A    1,2,3,4
A    8,9,10,11
A    12
B    4,5,6,7
B    8,9,10
Run Code Online (Sandbox Code Playgroud)

Mic*_*mer 7

这在awk使用数组拆分和常规循环时很容易:

{
    split($2, elements, ",")
    out = ""
    for (i in elements) {
        el = elements[i]
        key = $1 " " el
        if (!(key in used)) {
            out = out el ","
        }
        used[key] = 1
    }
    sub(/,$/, "", out)
    $2 = out
}
1
Run Code Online (Sandbox Code Playgroud)

对于每一行,我们用逗号分割第二列并将这些位保存到一个数组中elements。然后我们用循环为该列构建新值,检查我们之前是否见过该值。

我们保留了我们已经在(关联)数组中看到的一组值used。我们构造一个字符串,key其中包含第一列的值和我们当前正在查看的第二列的值。如果key是 in used,我们之前已经为这个 ID 看到过这个,不应该把它放在输出中;否则,它是新的,我们将值连接到out。为了不再使用它,我们将key(类似于“ A 3”)存储到我们的可见元素集中。

最后,我们将构建的列表放回第二列。这基本上是您在任何其他语言中采用的方法。

将上面的代码放入一个文件中,并使用awk -f或单引号将其全部作为命令行上的参数运行。