AWK-删除重复行-排除字段2不必匹配

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

我需要知道如何删除重复行,但不必匹配字段(本例中为字段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
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个变量,所有变量的名称都是单字符的。如果您在每个变量中添加两个字符,并使它们都有意义,那么您的代码将更容易理解。