我正在比较一年前我的数据的两个哈希集,并通过一系列的抨击我将两个文件切割成只是一个哈希值和文件名。我们正在谈论接近200万条款。
从这个great answer here我已经能够确认两个文件中存在哈希的位置,以及它们不存在于一个文件中并在另一个文件中存在的位置(例如,第二个文件集中添加了40K文件)对它来说,第一组中只有4个文件缺失 - 只是不会出现在第二组中。
我可以验证40K文件是从旧到新添加的:
awk 'FNR==NR{a[$1]=1;next}!($1 in a)' oldfile newfile | wc -l
并交换文件,我可以看到只有4个文件丢失。
然后我意识到我的基础是哈希。我实际上想以文件名为基础。
交换字段编号我能够确认一组略有不同的数字。新文件的添加没有问题,但我注意到第一组中只缺少 3 文件。
现在我想做的就是把它提升到一个新的水平并确认两个位置都存在的文件数量(很简单):
awk 'FNR==NR{a[$2]=1;next}($2 in a)' oldfile newfile | wc -l
但第一个字段会有所不同。
:~/working-hashset$ head file?
==> file1 <==
111 abc
222 def
333 ghi
444 jkl
555 fff
666 sss
777 vvv
==> file2 <==
111 abc
212 def
333 ggi
454 jjl
555 fff
656 sss
777 vss
:~/working-hashset$ awk 'FNR==NR{a[$1]=1;b[$2];next}($2 in b) {if(($1 in a)) print $0;}' file1 file2
111 abc
555 fff
:~/working-hashset$ awk 'FNR==NR{a[$1]=1;b[$2];next}($2 in b) {if(!($1 in a)) print $0;}' file1 file2
212 def
656 sss
:~/working-hashset$
这是一项正在进行中的工作(只写我几个小时前开始的这个问题,我已经解决了一些问题......一直在前进)。
我正处于测试两个文件并能够检测到哈希冲突,良好哈希,删除文件和新文件的阶段。
:~/working-hashset$ head file?
==> file1 <==
111 dir1/aaa Original good
222 dir1/bbb Original changed
333 dir1/ccc Original good will move
444 dir1/ddd Original change and moved
555 dir2/eee Deleted
666 dir2/fff Hash Collision
999 dir2/zzz Deleted
==> file2 <==
111 dir1/aaa Good
2X2 dir1/bbb Changed
333 dir3/ccc Moved but good
4X4 dir3/ddd Moved and changed
111 dir4/aaa Duplicated
666 dir4/fzf Hash Collision
777 dir5/ggg New file
888 dir5/hhh New file
:~/working-hashset$ cat hashutil
#!/usr/bin/env bash
echo Unique to file 1
awk 'FNR==NR{a[$1]=1;b[$2];next}!($2 in b)' file2 file1 # in 1, !in 2
echo
echo Unique to file 2
awk 'FNR==NR{a[$1]=1;b[$2];next}!($2 in b)' file1 file2 # in 2, !in 1
echo
echo In both files and good
awk 'FNR==NR{a[$1]=1;b[$2];next}($2 in b) {if(($1 in a)) print $0;}' file2 file1 # in both files and good
echo
echo In both files, wrong hash
awk 'FNR==NR{a[$1]=1;b[$2];next}($2 in b) {if(!($1 in a)) print $0;}' file2 file1 # in both files and wrong hash
echo
echo hash collision
awk 'FNR==NR{a[$1]=1;b[$2];next}!($2 in b) {if(($1 in a)) print $0;}' file1 file2 # hash collision
echo
echo Done!
这是输出:
Unique to file 1
333 dir1/ccc Original good will move
444 dir1/ddd Original change and moved
555 dir2/eee Deleted
666 dir2/fff Hash Collision
999 dir2/zzz Deleted
Unique to file 2
333 dir3/ccc Moved but good
4X4 dir3/ddd Moved and changed
111 dir4/aaa Duplicated
666 dir4/fzf Hash Collision
777 dir5/ggg New file
888 dir5/hhh New file
In both files and good
111 dir1/aaa Original good
In both files, wrong hash
222 dir1/bbb Original changed
hash collision
333 dir3/ccc Moved but good
111 dir4/aaa Duplicated
666 dir4/fzf Hash Collision
Done!
我现在想检测MOVED文件。
我知道我需要将其分解为更多&#34; chunks&#34;但它们将被正向斜线和不同层次进一步划分。
我知道字段的数量(NF)以及我想比较第一个字段(用空格分隔)和最后一个字段(用斜线分隔)和匹配然后用其余字段进行比较。如果它们全部相同则相同,否则如果第三个条件不同,则移动它。
我甚至不知道从哪里开始(凌晨4点不帮助)
感谢任何帮助。