0

我有两个文本文件:

文件1.txt

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

文件2.txt

8853
6437437567
36265
4566
.
.

输出可能是两个文件

匹配.txt

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

Non_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
4

2 回答 2

5

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

grep -Fw  -f File2.txt File1.txt > Match.txt
grep -Fwv -f File2.txt File1.txt > Non_Match.txt
于 2015-04-02T23:36:10.303 回答
1

这听起来有点像diff,或者wdiff如果您想在单词级别上执行此操作。

如果您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

这意味着将第一个文件修改为第二个文件的“最小”方式(每行)是删除所有行并添加所有新行。

但是,如果第二个文件是:

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+}
于 2015-04-02T23:37:36.033 回答