Linux 找出重复线之间的平均时间/距离

Linux 找出重复线之间的平均时间/距离,linux,shell,Linux,Shell,我有一个包含数万行重复内容的文件。我想以行号的形式找出重复项之间的平均时间/距离 例如:(其中第一列是行号) 将给出2(第一对副本之间有3行,第二对副本之间有1行,因为有2个副本,所以除以2) 关于如何处理这个问题有什么想法吗 编辑 Starting test! 32-bit hash: 0x995D9A6E 32-bit hash: 0xA27B264D 32-bit hash: 0x856ED0A5 32-bit hash: 0x3B83614D 32-bit hash: 0x23D92F4

我有一个包含数万行重复内容的文件。我想以行号的形式找出重复项之间的平均时间/距离

例如:(其中第一列是行号)

将给出2(第一对副本之间有3行,第二对副本之间有1行,因为有2个副本,所以除以2)

关于如何处理这个问题有什么想法吗

编辑

Starting test!
32-bit hash: 0x995D9A6E
32-bit hash: 0xA27B264D
32-bit hash: 0x856ED0A5
32-bit hash: 0x3B83614D
32-bit hash: 0x23D92F43
32-bit hash: 0xA1D0BE63
32-bit hash: 0xB0BF66B6
32-bit hash: 0x968F7074
32-bit hash: 0x76F75FD1
32-bit hash: 0x76A51358

您可以使用GNU awk执行此操作:

$ cat a.txt 
string1
string2
string2
string1
string3

$ cat test.awk
{
    if($0 in lines) {
        distance += NR - lines[$0];
        ++count;
    }
    else {
        lines[$0] = NR;
    }
}
END {
    print distance / count;
}

$ awk -f test.awk < a.txt 
2
$cat a.txt
string1
string2
string2
string1
弦3
$cat test.awk
{
如果($0行){
距离+=每行[$0];
++计数;
}
否则{
行[$0]=个;
}
}
结束{
打印距离/计数;
}
$awk-f test.awk

上面给出了线的第一个引用与其他引用之间的距离。如果希望在同一直线的下一次和上一次出现之间有一个距离,请执行以下操作:

    # ...
    if($0 in lines) {
        distance += NR - lines[$0];
        lines[$0] = NR; # <--- add this
        ++count;
    }
    # ...
#。。。
如果($0行){
距离+=每行[$0];

行[$0]如果你有3条重复的线,你会考虑什么距离:1-2、1-3、2-3?我猜我会把它们当作两个单独的重复。考虑的距离在第一和第二、第二和第第三之间。嗯,你首先说你只考虑到第一次出现的距离。我不相信这能奏效。用一个正常大小的文件编辑它,但只有两行重复(每行重复一次)并手动计算。@SamSong它对您提供的示例有效。发布另一个示例。用输入中的示例编辑问题。是否有方法发布整个文件?先生,您帮了很大的忙。谢谢。
    # ...
    if($0 in lines) {
        distance += NR - lines[$0];
        lines[$0] = NR; # <--- add this
        ++count;
    }
    # ...