我正在学习 bash,我需要比较两个几乎相同的文本文件(只有少数位被翻转)并输出相同的位数。换句话说,我需要比较位,而不是字符。阅读 bash 文档时,我遇到了 and 命令comm
,diff
但它们似乎逐行比较文件,而不是逐位比较。任何帮助都将不胜感激。
答案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*", $_)'
可以将文件的每一位(从每个字节中的最低有效位开始)打印为0
和1
字符,每行一个。
一旦每个文件都获得了该文件,您就可以将其并排粘贴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