Bash 在另一个字段相同的文件之间查找一个字段中的更改

Bash 在另一个字段相同的文件之间查找一个字段中的更改,bash,awk,Bash,Awk,我比较了一年前的两个数据哈希集,通过一系列的抨击,我将这两个文件缩减为一个哈希值和文件名。我们谈论的是近200万份参赛作品 从这一点上,我能够确认哈希在两个文件中的位置,以及它们在一个文件中不存在和在另一个文件中存在的位置(例如,第二个文件集中添加了40K个文件,而第一个文件集中只缺少4个文件,而第二个文件集中没有) 我可以通过以下方式验证是否已将40K个文件从旧添加到新: awk 'FNR==NR{a[$1]=1;next}!($1 in a)' oldfile newfile | wc -l

我比较了一年前的两个数据哈希集,通过一系列的抨击,我将这两个文件缩减为一个哈希值和文件名。我们谈论的是近200万份参赛作品

从这一点上,我能够确认哈希在两个文件中的位置,以及它们在一个文件中不存在和在另一个文件中存在的位置(例如,第二个文件集中添加了40K个文件,而第一个文件集中只缺少4个文件,而第二个文件集中没有)

我可以通过以下方式验证是否已将40K个文件从旧添加到新:

awk 'FNR==NR{a[$1]=1;next}!($1 in a)' oldfile newfile | wc -l
交换文件时,我发现只有4个文件丢失了

然后我意识到我只是基于散列。实际上,我想基于文件名

交换fieldnumber后,我能够确认一组稍微不同的数字。新文件的添加没有问题,但我注意到第一组中只缺少3个文件

现在,我想做的是将其提升到下一个级别,并确认两个位置中存在的文件数(非常简单):

但第一个字段的位置会有所不同

:~/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$ 
我现在想检测移动的文件

我知道我需要把它分成更多的“块”,但它们将被进一步的正斜杠分隔,并且在不同的级别

我知道字段的数量(NF),我想比较第一个字段(由空格分隔)和最后一个字段(由斜杠分隔),匹配后再比较其余字段。如果它都一样,那么它就一样,否则如果第三个条件不同,它就移动了

我甚至不知道从哪里开始(凌晨4点没用)

感谢您的帮助

:~/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!