逐行比较 2 个文件的脚本

Script to compare 2 files line by line

我有两个文本文件:

File1.txt

dadads 434 43 {"4fsdf":"66db1" fdf1:"5834"}
gsgss 45 0 {"gsdg":"8853" sgdfg:"4631"}
fdf 767 4643 {"klhf":"3455" kgs:"4566"}
.  
.

File2.txt

8853
6437437567
36265
4566
.
.

输出可以是两个文件

Match.txt

gsgss 45 0 {"gsdg":"8853" sgdfg:"4631"}
fdf 767 4643 {"klhf":"3455" kgs:"4566"}

非_Match.txt

dadads 434 43 {"4fsdf":"66db1" fdf1:"5834"}

有人可以帮我写 bash 脚本吗?

如果有帮助,我想我有逻辑:

 for (rows in File1.txt) {
   bool found = false;
    for (id in File2.txt) {
      if (row contains id) {
      found = true;
      echo row >> Match.txt
      break;
     }
    }
   if (!found) {
      echo row >> Non_Match.txt
   }
  }

编辑部分:

我也有一个 bash 脚本,但它没有帮助,因为它没有放置匹配的行,而是只放置匹配的 ID..

#!/bin/bash

set -e

file1="File2.txt"
file2="File1.txt"

for id in $(tail -n+1 "${file1}"); do
   if ! grep "${id}" "${file2}"; then
      echo "${id}" >>non_matches.txt
   else
       echo "${id}" >>matches.txt
   fi
done

您可以使用 grep -f 来查找列在单独文件中的搜索模式。也可以使用 -F(固定字符串)和 -w(匹配整个单词)标志。

grep -Fw  -f File2.txt File1.txt > Match.txt
grep -Fwv -f File2.txt File1.txt > Non_Match.txt

这听起来有点像 diffwdiff 如果你想在单词级别上这样做的话。

如果你 运行 diff 你的两个文件,你将生成以下输出:

< dadads 434 43 {"4fsdf":"66db1" fdf1:"5834"}
< gsgss 45 0 {"gsdg":"8853" sgdfg:"4631"}
< fdf 767 4643 {"klhf":"3455" kgs:"4566"}
---
> 8853
> 6437437567
> 36265
> 4566

这意味着将第一个文件修改为第二个文件的"minimal"方式(根据)是删除所有行并添加所有新行。

如果第二个文件是:

8853
6437437567
gsgss 45 0 {"gsdg":"8853" sgdfg:"4631"}
36265
4566

diff 输出为:

1c1,2
< dadads 434 43 {"4fsdf":"66db1" fdf1:"5834"}
---
> 8853
> 6437437567
3c4,5
< fdf 767 4643 {"klhf":"3455" kgs:"4566"}
---
> 36265
> 4566

所以diff不再要求删除第二行。

wdiff 大致相同,但在单词级别:

[-dadads 434 43 {"4fsdf":"66db1" fdf1:"5834"}-]{+8853
6437437567+}
gsgss 45 0 {"gsdg":"8853" sgdfg:"4631"}
[-fdf 767 4643 {"klhf":"3455" kgs:"4566"}-]
{+36265
4566+}