比较文件中的连续行

时间:2015-06-26 17:51:13

标签: unix awk

我有两个文件,每列有1和0,字段分隔符是“,”:

1,0,0,1,1,1,0,0,0,0,1,0,0,1,1,0,1,0
0,1,0,1,1,1,0,1,0,1,0,0,0,0,0,0,0,0
1,0,0,0,1,0,0,1,0,0,0,1,0,0,1,0,1,0
1,0,0,0,1,0,0,1,0,0,0,1,0,0,1,0,1,0
1,0,1,0,0,0,0,1,1,1,1,1,1,1,1,1,0,1
1,0,1,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0
1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0
1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0
1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0
1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0

我想要做的是查看成对行的文件,比较它们,如果它们是完全相同的输出a 1.所以对于这个例子,行1& 2是不同的,所以他们没有得到1,第3行和3。 4完全相同,因此它们得到1,而行5和6相差1列,因此它们不会得到1,依此类推。

所以期望的输出可能是这样的:

1
1
1

因为这里完全相同的行有3对(它们是连续的事实配对):行3& 4,7& 8和9& 10。比较不应该重用一行,所以如果比较第1行和第1行。 2,你不应该比较第2行和第2行。 3.

2 个答案:

答案 0 :(得分:1)

你可以用awk这样做:

awk -F, '!(NR%2) {print $0==p} {p=$0}' data
0
1
0
1
1

如果当前行与0p的最后一个值不匹配,则每个可被2整除的行将打印1它匹配。

如果你真的只想要1 s,它丢弃了哪些配对匹配的信息,你可以:

awk -F, '!(NR%2)&&$0==p {print 1} {p=$0}' data
1
1
1

或者,您可以输出匹配的对行号,如:

awk -F, '!(NR%2)&&$0==p {print NR-1 "," NR} {p=$0}' data
3,4
7,8
9,10

或者只是所有匹配对的计数:

awk -F, '!(NR%2)&&$0==p {c++} {p=$0} END{ print c}' data
3

另一个有用的变体可能只是直接返回匹配的行:

awk -F, '!(NR%2)&&$0==p {print} {p=$0}' data
1,0,0,0,1,0,0,1,0,0,0,1,0,0,1,0,1,0
1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0
1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0

答案 1 :(得分:0)

我会使用这样的shell脚本:

while read line
do
    if test "$prevline" = "$line"
    then
        echo 1
    fi      

    prevline=$line
done

我不是100%肯定你对“不重用一行”的要求,但我认为可以通过将循环的内部部分改为

来实现。
    if test "$prevline" = "$line"
    then
        echo 1
        line=""        # don't reuse a line
    fi