将txt文件中的每一行与每行中的另一个文本文件进行比较

时间:2015-07-17 15:22:57

标签: linux bash shell

这些天我在shell脚本方面遇到了一些困难。 完成一些测试仍然无法使其工作。 我正在尝试将文本文件中的每一行与另一个文本文件进行比较。我的想法是查看文件中是否有某些行。

有人可以看到我的剧本出了什么问题吗?

谢谢!

#!/bin/bash
  FILE1='/filePath/file.txt'
  FILE2='/filePath/file2.txt'
  for line in $FILE1 
  do
    for line2 in $FILE2
    do
        if  $line != $line2
            then
            echo -e /> diffsScr.txt
        fi
    done 
  done

3 个答案:

答案 0 :(得分:3)

awk 'FNR==NR{f[$0]+=1; next} !($0 in f)' input1 input2

这将读取文件input1并构建一个数组。然后它会经过input2并打印出input1中未显示的每一行。如果您想添加行号:

awk 'FNR==NR{f[$0]+=1; next} !($0 in f) { print FNR, $0}' input1 input2

这种方法的一大优势是它可以很好地扩展。你的方法是O(n * m),其中n和m是文件中的行数,但预先读入这样的数组会给你一个O(n + m)的解决方案。换句话说,您只能阅读每个文件一次。

答案 1 :(得分:0)

您可以使用以下命令实现此结果:

fgrep -v -x -f '/filePath/file2.txt' '/filePath/file1.txt'

答案 2 :(得分:0)

如果您的文件已排序,您可以使用 comm 来比较文件。

comm -23 file1 file2  

comm的描述:

   Compare sorted files FILE1 and FILE2 line by line.

   With  no  options,  produce  three-column  output.  Column one contains
   lines unique to FILE1, column two contains lines unique to  FILE2,  and
   column three contains lines common to both files.

   -1     suppress column 1 (lines unique to FILE1)

   -2     suppress column 2 (lines unique to FILE2)

   -3     suppress column 3 (lines that appear in both files)