两个文件之间的位比较

两个文件之间的位比较

我正在学习 bash,我需要比较两个几乎相同的文本文件(只有少数位被翻转)并输出相同的位数。换句话说,我需要比较位,而不是字符。阅读 bash 文档时,我遇到了 and 命令commdiff但它们似乎逐行比较文件,而不是逐位比较。任何帮助都将不胜感激。

答案1

假设您指的是字节而不是位,您可以使用cmp(来自man cmp):

姓名

cmp - 逐字节比较两个文件

以这两个文件为例:

$ cat file1
The quick brown fox jumped over the lazy dog.

$ cat file2
The quick flown fax jumped over the hazy log.

你可以做:

$ cmp -lb file1 file2
11 142 b    146 f
12 162 r    154 l
18 157 o    141 a
37 154 l    150 h
42 144 d    154 l

或者,您可以使用fold每行打印一个字节并将其传递给diff

$ diff <(fold -b1 file1) <(fold -b1 file2)
11,12c11,12
< b
< r
---
> f
> l
18c18
< o
---
> a
37c37
< l
---
> h
42c42
< d
---
> l

答案2

示例文件:

$ cat tmp1 tmp2
unix and linux
uniq and lynux

您可以使用xxd如下diff

$ diff <(xxd -c1 tmp1) <(xxd -c1 tmp2)
4c4
< 00000003: 78  x
---
> 00000003: 71  q
11c11
< 0000000a: 69  i
---
> 0000000a: 79  y

可选择-b检查

$ diff <(xxd -c1 -b tmp1) <(xxd -c1 -b tmp2)
4c4
< 00000003: 01111000  x
---
> 00000003: 01110001  q
11c11
< 0000000a: 01101001  i
---
> 0000000a: 01111001  y

答案3

perl -lne 'BEGIN{$/=\8192}; print for split "", unpack("b*", $_)'可以将文件的每一位(从每个字节中的最低有效位开始)打印为01字符,每行一个。

一旦每个文件都获得了该文件,您就可以将其并排粘贴paste -d '\0'。然后你可以只计算 00 和 11 的个数来grep -xce 00 -e 11计算它们共有的位数。

bits() {
  perl -lne 'BEGIN{$/=\8192}; print for split "", unpack("b*", $_)' "$1"
}
paste -d '\0' <(bits file1) <(bits file2) | grep -xce 00 -e 11

相关内容