【问题标题】:Script to compare 2 files line by line逐行比较2个文件的脚本
【发布时间】:2015-04-02 23:25:03
【问题描述】:

我有两个文本文件:

文件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
.
.

输出可能是两个文件

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

【问题讨论】:

  • diff 比较文件逐行,但与行等价。
  • 我认为常规的 diff 命令无法满足我的需求。
  • 你的逻辑看起来不错,你应该尝试编写脚本,而不是让随机的互联网陌生人为你做。
  • @user175084:你可以使用wdiff...
  • 文件也是1.8M和15M.. wdiff会支持吗??

标签: linux bash file shell file-comparison


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    这听起来有点像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
    

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

    如果第二个文件是:

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

    【讨论】:

      猜你喜欢
      • 2013-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-26
      • 1970-01-01
      • 1970-01-01
      • 2017-04-06
      • 1970-01-01
      相关资源
      最近更新 更多