测试两条相邻的线

时间:2012-03-27 09:26:55

标签: shell unix awk

我有一个包含我的行的文件,我想比较一个接一个的行来测试它们是否相同,除了最后一列。例如:

example/example 321
example/example 456
otherexample/otherexample 321

在这种情况下,我希望程序只返回:

example/example

由于第一列匹配,但第二列不同。使用Unix工具执行此操作的最佳方法是什么?到目前为止,我已经尝试了 awk ,但收效甚微。非常感谢。

4 个答案:

答案 0 :(得分:2)

# sample data
$ cat input.txt
example/example 321
example/example 456
example/example 789
otherexample/otherexample 321
abc
otherexample/otherexample 321

$ awk 'x==$1{print $1; while(getline){if(x!=$1)break}}{x=$1}' input.txt
example/example

答案 1 :(得分:0)

一种方式:

script.awk的内容:

## In first line, get path and init counter of consecutive paths.
FNR == 1 { 
    path = $1
    repeats = 1 
    next
}

FNR > 1 { 
    ## If current path is same as previous one, increment counter.
    if ( path == $1 ) { 
        ++repeats;
    }   
    ## Else, there is new path, so print previous and init counter.
    else {
        print_repeated_path( repeats, path )
        path = $1
        repeats = 0 
    }   
}

END {
    print_repeated_path( repeats, path )
}

function print_repeated_path(r, path) {
    if ( r > 1 ) { 
        printf "%s\n", path
    }   
}

infile的内容:

example/example 321
example/example 456
otherexample/otherexample 321
other/example 456
other/example 678
other/example 123
otherexample/otherexample 321

像以下一样运行:

awk -f script.awk infile

以下结果:

example/example
other/example

答案 2 :(得分:0)

sort -u temp.txt|awk '{a[$1]++}END{for (i in a){if(a[i]>1)print i;}}'

答案 3 :(得分:0)

这可能对您有用:

cut -d' ' -f1 file | sort | uniq -d

或者这个:

 sort file | sed '$!N;/^\(\S*\) .*\n\1.*/!D;bb;:a;$!N;:b;s//\1/;ta;P;D'