用于逐行比较2个文件的脚本

时间:2015-04-02 23:25:03

标签: linux bash file shell file-comparison

我有两个文本文件:

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"}

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

2 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:1)

如果您想在字词级别执行此操作,这听起来有点像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

这意味着&#34; minimal&#34;方式(每)将第一个文件修改为第二个文件,删除所有行并添加所有新行。

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

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+}