我想从给定的列(示例中的 $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)
{
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
或单引号将其全部作为命令行上的参数运行。
归档时间: |
|
查看次数: |
225 次 |
最近记录: |