使用bash查找两个文件之间的差异

时间:2014-12-19 10:14:35

标签: linux bash compare

我知道有几个这样的主题已经得到解答,但我在这个主题中找到的所有代码都没有解决我的问题。所以这是描述。

我有两个文件的问题。第一个文件由308370行组成,另一个由308369行组成。两个文件都需要具有相同的长度和相同的顺序。我已经订购了它们。您可以比较两个文件的列是第2列。因此,为了更容易处理,我将第二列从两个文件中提取到单独的临时文件中。

我尝试了几件事。我比较了两个临时文件并搜索了空行但结果总是没有。我发现没有区别,但显然必须有所不同。这很烦人。希望你能帮助我。

这就像临时文件一样:

rs12345
rs34567
rs45679567
rs345635

这是我已经尝试过的bash-code:

comm file1 file2
grep -v -F -x -f file1 file2
awk 'FNR==NR{a[$0]++;next}!a[$0]' file1 file2
diff file_1 file_2 | grep '^>' | cut -c 3-

最后我想删除文件1中但不在文件2中的这一行。 感谢您提前帮助我。

最佳, 托比

3 个答案:

答案 0 :(得分:1)

如果我理解正确的话,

#!/bin/sh

awk -v file=0 -v offset=0 '
  file == 0 {
    data[FNR] = $0                       # read first file into memory, both
    key[FNR]  = $2                       # lines and isolated keys
  }
  file == 1 {
    while(key[FNR + offset] != $2) {     # When parsing the second file,
      offset = offset + 1                # skip lines in the first that do not
                                         # match keys in the second
      if(FNR + offset > length(key)) {
        exit
      }
    }
    print data[FNR + offset]             # when key is found, print corresponding
  }                                      # line from the first file
  ENDFILE {
   file = file + 1                       # set flag when first file is over.
  }' longer.txt shorter.txt

应该做的伎俩。给出两个文件

foo 1 bar
foo 2 bar
foo 3 bar
foo 4 bar

qux 1 xyzzy
qux 2 xyzzy
qux 4 xyzzy

打印

foo 1 bar
foo 2 bar
foo 4 bar

答案 1 :(得分:1)

如果您可以使用GUI工具,那么我建议您meld。易于使用,它显示了额外的空间等细微差别。否则,您可以使用diff。查看diff的手册页以获取更多信息。

答案 2 :(得分:0)

首先再次感谢您的帮助。 我的帖子后几分钟我解决了我的问题。 我很抱歉偷你的时间。

当我对文件进行排序时,我看到一行是空行。所以我删除了这条线,就是这样。但我对此有点好奇,因为我证明文件是否有空行。为此我用过:

grep -v '^$' input > output

似乎这不起作用。 我真的很抱歉,但我肯定会尝试你的代码@Wintermute。 它看起来很棒。

最佳, 托比