我有两个文件,每列有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.
答案 0 :(得分:1)
你可以用awk这样做:
awk -F, '!(NR%2) {print $0==p} {p=$0}' data
0
1
0
1
1
如果当前行与0
或p
的最后一个值不匹配,则每个可被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