JS 45行代码 不是最简单的,但是如果没有思路的话,可以看看,帮助理解

var i = 0 , title = {} , str = {} , sum = {} , num1 = 0 , arr_1 = {}
while(line=readline()){
    var lines = line.split('  ')
    var a = lines[0]
    for(var j=0 ; j<=i ; j++){        //这个for循环是将完全相同的数据删除,只保留第一次出现
        if(a != title[j]){            //将每一行数据后面加上一个代表数量的值,并且全都赋值为‘1’
            if( i == j ){         
                title[i] = a
                str[i] = a.split('\\')[a.split('\\').length-1].substring(a.split('\\')[a.split('\\').length-1].length-20) + ' ' + 1
                i++
                break
            }
        }    
        else if(a == title[j])
            break
    }
}
for(var z=0 ; z<i ; z++){                    //这个for循环是为了查询所有文件名和行号相同但是路径不同的数据
    for(var num=z+1 ; num<i ; num++){        //并且此时的数据只保存最后一条下划线后面的数据
        if( str[z].split(' ')[0] == str[num].split(' ')[0] && str[z].split(' ')[1] == str[num].split(' ')[1]){
            sum[num1] = num                  //如果文件名和代码行数相同,数量值+1
            num1++
            var v = parseInt(str[z].split(' ')[2])
            v++
            str[z] = str[z].split(' ')[0] + ' ' + str[z].split(' ')[1] + ' ' + v
        }
    }
}
var num_f = 0            
for(var num2=i-1 ; num2>=0 ; num2--){          //这个for循环是将所有文件名和行号相同但是路径不同的数据只保留第一个,其他的删除
    for(var num3=num2-1 ; num3>=0 ; num3--){
        if(str[num2].split(' ')[0] == str[num3].split(' ')[0] && str[num2].split(' ')[1] == str[num3].split(' ')[1])
            break
        else if(num3 == 0){
            arr_1[num_f] = str[num2]
            num_f++
        }
    }
}
arr_1[num_f] = str[0]                     //因为上面的for循环不会将str数组的第一个值赋给数组arr_1,因此这里手动赋值
for(var num2=7 ; num2>=0 ; num2--)        
//因为要输出最后八条数据,上面的for循环是倒序遍历,也是倒序赋值,因此这里从下表为7开始输出,输出到下表为0为止,一共八条
    if(arr_1[num2])                       //先进行判断,在输出,因为如果数据不够八条不判断的话,会输出undefined
        console.log(arr_1[num2])