Linux MD5两个文本文件之间的比较

Linux MD5两个文本文件之间的比较,linux,bash,shell,Linux,Bash,Shell,我刚开始学习Linux shell脚本。对于版本控制示例,我必须在Linux shell脚本中比较这两个文件: file1.txt 275caa62391ff4f3096b1e8a4975de40苹果 awd6s54g64h6se4h6se45wahae654j6钢球 e4rby1s6y4653a46h153a41bqwa54tvi类 r53aghe4354hr35a4hr65a46eeh5j45ro蓖麻 file2.txt 275caa62391ff4f3096b1e8a4975de40

我刚开始学习Linux shell脚本。对于版本控制示例,我必须在Linux shell脚本中比较这两个文件:

file1.txt

  • 275caa62391ff4f3096b1e8a4975de40苹果
  • awd6s54g64h6se4h6se45wahae654j6钢球
  • e4rby1s6y4653a46h153a41bqwa54tvi类
  • r53aghe4354hr35a4hr65a46eeh5j45ro蓖麻
file2.txt

  • 275caa62391ff4f3096b1e8a4975de40苹果
  • js65fg4a64zgr65f4w65ea465fa65gh7钢球
  • wroghah4a65ejdtse5z4g6sa7H658aw7蜡烛
  • WAGJH54HR5AE454ZRRH354AHA4564RE蓖麻
如何在新添加(在文件2中添加但不在文件1中)、已删除(在文件2中删除但不在文件1中)和更改的文件(名称相同但校验和不同)中对这些文本文件进行排序? 我尝试使用diff、bcompare、vimdiff,但没有得到一个正确的文本文件输出


提前感谢

我不知道是否存在这样的命令,但我冒昧地在Bash中为您编写了一个排序机制。虽然它经过了优化,但我建议您用自己选择的语言重新创建它

#/bin/bash
#将数组分隔符设置为换行符
IFS=$'\n'
#如果$1为空,则默认为“file1.txt”。2美元也一样。
FILE1=${1:-FILE1.txt}
FILE2=${2:-FILE2.txt}
已删除=()
已添加=()
已更改=()
#循环数组$1并打印内容
函数数组打印{
#-n创建指向数组的“指针”。此
#将大型数组传递给函数的方式。
本地-n数组=$1
回显“$1:”
对于“${array}”中的i,请执行以下操作
回声$i
完成
}
#此函数用于循环文件_in中的条目并进行检查
#如果它们存在于文件\u tst中。除非找到替身,否则
#执行回调。
函数数组{
本地文件_in=“$1”
本地文件_tst=“$2”
本地回调=${3:-true}
本地-n arr0=$4
本地-n arr1=$5
当读取-r行时;执行

tst_hash=$(grep-Eo'^[^]+'我不知道是否存在这样的命令,但我冒昧地在Bash中为您编写了一个排序机制。尽管它经过了优化,但我建议您使用自己选择的语言重新创建它

!/bin/bash
#将数组分隔符设置为换行符
IFS=$'\n'
#如果$1为空,则默认为“file1.txt”。对于$2也是如此。
FILE1=${1:-FILE1.txt}
FILE2=${2:-FILE2.txt}
已删除=()
已添加=()
已更改=()
#循环数组$1并打印内容
函数数组打印{
#-n创建指向数组的“指针”。此
#将大型数组传递给函数的方式。
本地-n数组=$1
回显“$1:”
对于“${array}”中的i,请执行以下操作
回声$i
完成
}
#此函数用于循环文件_in中的条目并进行检查
#如果它们存在于文件\u tst中。除非找到双精度,否则
#执行回调。
函数数组{
本地文件_in=“$1”
本地文件_tst=“$2”
本地回调=${3:-true}
本地-n arr0=$4
本地-n arr1=$5
当读取-r行时;执行

tst_hash=$(grep-Eo'^[^]+'仅在file1.txt中的文件:

 awk 'NR==FNR{a[$2];next} !($2 in a)' file2.txt file1.txt > only_in_file1.txt

仅在file2.txt中的文件:

 awk 'NR==FNR{a[$2];next} !($2 in a)' file1.txt file2.txt > only_in_file2.txt
然后是这样的回答:

e、 g:

不过,你需要想出如何呈现这些内容


在最后一个示例中,可能有一种更优雅的方法来循环(而不是查找带有NA的文件,然后重新过滤),但是它仍然足以关闭仅在file1.txt中的文件:

 awk 'NR==FNR{a[$2];next} !($2 in a)' file2.txt file1.txt > only_in_file1.txt

仅在file2.txt中的文件:

 awk 'NR==FNR{a[$2];next} !($2 in a)' file1.txt file2.txt > only_in_file2.txt
然后是这样的回答:

e、 g:

不过,你需要想出如何呈现这些内容


也许有一种更优雅的方法可以循环最后一个例子(而不是找到那些带有NA的,然后重新过滤),但是对于第3部分(名称相同,但校验和不同)——尝试
md5sum-c file1 file2
对于第3部分,他指的是第3部分文本的第一部分(名称相同但校验和不同)---试试看第三部分,他指的是文本的第一部分。看起来这个bash程序只比较了四行数据,我想比较两个有很多行的文本文件。非常感谢你的代码。@karkator,你为什么这么认为?数据是从一个文件中获取的,不管文件的长度是多少f file.看起来这个bash程序只比较了四行的数据,我想比较两个有很多行的文本文件。非常感谢你的代码。@karkator你为什么这么认为?数据取自一个文件,不管文件的长度如何。