我是bash shell脚本的新手。 如何比较无扩展名文件的8个输出(仅二进制值)-相同长度的值,0或1。 为了澄清这些,这是我到目前为止所做的。
for d in */; do
find . -name base -execdir sh -c 'cat {} >> out' \;
done
我找到了位于子文件夹中的所有文件,将所有二进制文件读取并连接到out文件中。
现在我有8个要比较的文件(8个父文件夹)。
我已经尝试过“ diff” 和“ cmp” -但它们都只能使用2个文件。
最后,我需要检查并验证这8个二进制文件之间是否存在差异,并最终导出结果并以HEX格式表示它们-例如:如果out文件中有2个都为'1'= F,如果所有的'0'= 0。因此,最终结果应为: FFFF 0000 (第4个文件均为“ 1”,最后4个文件均为“ 0”)。
这样做的最佳选择是什么? -希望我能弄清楚我的情况。
非常感谢您的帮助。
答案 0 :(得分:0)
cat $path/$files|uniq -u>/tmp/output.txt
grep -f /tmp/output.txt $path/$files
答案 1 :(得分:0)
让我假设:
dir1/out.txt
,dir2/out.txt
,..
dir8/out.txt
。然后执行以下步骤:
sha256sum
。我已经创建了8个测试文件,分别是dir1 / out.txt,dir2 / out.txt和dir4 / out.txt 相同,dir3 / out.txt和dir7 / out.txt相同,其他 不同。
然后哈希值将如下所示:
sha256sum dir*/out.txt
298497ad818c3d927498537ed5ab4f9ae663747b6d00ec9a5d0bd9e30a6b714b dir1/out.txt
298497ad818c3d927498537ed5ab4f9ae663747b6d00ec9a5d0bd9e30a6b714b dir2/out.txt
e962879ef251f2117460cf0d5ce714e36a9ab79f2548c48e2121b4e573cf179b dir3/out.txt
298497ad818c3d927498537ed5ab4f9ae663747b6d00ec9a5d0bd9e30a6b714b dir4/out.txt
f45151f5253c62de69c95935f083b5649876fdb661412d4f32065a7b018bf68b dir5/out.txt
bdc26931acfb734b142a8d675f205becf27560dc461f501822de13274fe6fc8a dir6/out.txt
e962879ef251f2117460cf0d5ce714e36a9ab79f2548c48e2121b4e573cf179b dir7/out.txt
11a77c3d96c06974b53d7f40a577e6813739eb5c811b2a86f59038ea90add772 dir8/out.txt
总结一下结果,让我用 group id 替换哈希值, 相同文件的出现顺序是相同的编号。
这是脚本:
sha256sum dir*/out.txt | awk '{if (!gid[$1]) gid[$1] = ++n; print $2 " " gid[$1]}'
输出:
dir1/out.txt 1
dir2/out.txt 1
dir3/out.txt 2
dir4/out.txt 1
dir5/out.txt 3
dir6/out.txt 4
dir7/out.txt 2
dir8/out.txt 5
第二个字段显示 group id ,以指示哪些文件相同。
请注意,组ID 并不将每个文件的内容表示为:
if 2 of the out.txt files are all '1' = F , and if all '0' = 0
,
因为我不知道文件的外观。如果OP可以提供
示例文件,可能会对我有所帮助。
顺便说一句,我仍然不确定文件 是普通意义上的二进制文件,因为
OP提到“它只是一个文件,其文件中包含0或1
当我打开它时值。”在我看来,文件由
ASCII“ 0”和“ 1”。我上面的脚本应适用于两个二进制文件
和文本文件。
[更新]
根据OP的信息,以下是针对特定情况的解决方案:
#!/bin/bash
for f in dir*/out.txt; do
if [[ $(uniq "$f" | wc -l) = 1 ]]; then
echo -n "$(head -1 "$f" | tr 1 F)"
else
echo -n "-"
fi
done
echo
它将每个文件的内容摘要到以下任何一个:全为0的0
,全1的F
或混合情况的-
。(可能是错误)。
例如,如果dir {1..4} /out.txt全为0,dir5 / out.txt为混合型,而dir {6..8} /out.txt全为1,则输出看起来像:
0000-FFF
我希望它将满足OP的要求。