AWK-删除重复行-排除字段2不必匹配
我需要知道如何删除重复行,但不必匹配字段(本例中为字段2)。AWK优先考虑 输入:AWK-删除重复行-排除字段2不必匹配,awk,Awk,我需要知道如何删除重复行,但不必匹配字段(本例中为字段2)。AWK优先考虑 输入: LSP1 1000 NODE1 NODE2 NODE3 LSP1 2000 NODE1 NODE2 NODE3 LSP2 3000 NODE1 NODE2 LSP2 2500 NODE3 LSP3 4000 NODE1 NODE2 NODE3 NODE4 LSP3 4000 NODE1 NODE2
LSP1 1000 NODE1 NODE2 NODE3
LSP1 2000 NODE1 NODE2 NODE3
LSP2 3000 NODE1 NODE2
LSP2 2500 NODE3
LSP3 4000 NODE1 NODE2 NODE3 NODE4
LSP3 4000 NODE1 NODE2
LSP2 3000 NODE1 NODE2
LSP2 2500 NODE3
LSP3 4000 NODE1 NODE2 NODE3 NODE4
LSP3 4000 NODE1 NODE2
输出:
LSP1 1000 NODE1 NODE2 NODE3
LSP1 2000 NODE1 NODE2 NODE3
LSP2 3000 NODE1 NODE2
LSP2 2500 NODE3
LSP3 4000 NODE1 NODE2 NODE3 NODE4
LSP3 4000 NODE1 NODE2
LSP2 3000 NODE1 NODE2
LSP2 2500 NODE3
LSP3 4000 NODE1 NODE2 NODE3 NODE4
LSP3 4000 NODE1 NODE2
awk
辅助uniq
解决方案uniq
可以跳过字段,但必须从头开始;助手awk
脚本交换前两个字段;后来又打电话来按同样的顺序放回去
$ function s12() { awk '{t=$1;$1=$2;$2=t}1' </dev/stdin; }; s12 <file | uniq -uf1 | s12
LSP2 3000 NODE1 NODE2
LSP2 2500 NODE3
LSP3 4000 NODE1 NODE2 NODE3 NODE4
LSP3 4000 NODE1 NODE2
$function s12(){awk'{t=$1;$1=$2;$2=t}1'
我们的想法是从$0
中删除第二个字段,并将其存储在t
中。然后,我们建立原始行的哈希a
,哈希b
,其中我们计算没有第二个字段的行的出现次数,以及没有字段两个值的行号到行的哈希c
,以便我们可以重现or原始秩序
最后,对于每个行号((c中的i)
),我们检查该行(删除第二个字段)在文件(b[c[i]]
)中出现的次数。如果恰好是一次,则打印原始值(a[c[i]]
)。如果不关心输出顺序:
$ cat tst.awk
{
orig0 = $0
$2 = ""
key = $0
vals[key] = orig0
cnt[key]++
}
END {
for ( key in cnt ) {
if ( cnt[key] == 1 ) {
print vals[key]
}
}
}
$ awk -f tst.awk file
LSP2 2500 NODE3
LSP2 3000 NODE1 NODE2
LSP3 4000 NODE1 NODE2
LSP3 4000 NODE1 NODE2 NODE3 NODE4
如果您这样做:
$ awk -f tst.awk file
$ cat tst.awk
{
orig0 = $0
$2 = ""
key = $0
}
++cnt[key] == 1 {
keys[++numKeys] = key
vals[key] = orig0
}
END {
for ( keyNr=1; keyNr<=numKeys; keyNr++ ) {
key = keys[keyNr]
if ( cnt[key] == 1 ) {
print vals[key]
}
}
}
$ awk -f tst.awk file
LSP2 3000 NODE1 NODE2
LSP2 2500 NODE3
LSP3 4000 NODE1 NODE2 NODE3 NODE4
LSP3 4000 NODE1 NODE2
$awk-f tst.awk文件
$cat tst.awk
{
orig0=$0
$2 = ""
密钥=$0
}
++cnt[键]==1{
键[++numKeys]=键
VAL[键]=orig0
}
结束{
对于(keyNr=1;keyNr为什么LSP1
被删除,$2
不匹配?您的帖子需要更多详细信息。看起来每个帖子都得到了@jww-ed。向上投票以补偿…您可以用$2=“”替换sub(“$2,”)
@karakfa很好的观点,更改了答案。您有5个变量,所有变量的名称都是单字符的。如果您在每个变量中添加两个字符,并使它们都有意义,那么您的代码将更容易理解。