查找两个文本文件之间的差异,每行一项[重复]

Posted

技术标签:

【中文标题】查找两个文本文件之间的差异,每行一项[重复]【英文标题】:find difference between two text files with one item per line [duplicate] 【发布时间】:2011-05-03 23:56:06 【问题描述】:

我有两个文件:

文件 1

dsf
sdfsd
dsfsdf

文件 2

ljljlj 
lkklk 
dsf
sdfsd
dsfsdf

我想显示文件 2 中的内容,而不是文件 1 中的内容,因此文件 3 应该是这样的

ljljlj 
lkklk 

【问题讨论】:

【参考方案1】:
grep -Fxvf file1 file2

标志的含义:

-F, --fixed-strings
              Interpret PATTERN as a list of fixed strings, separated by newlines, any of which is to be matched.    
-x, --line-regexp
              Select only those matches that exactly match the whole line.
-v, --invert-match
              Invert the sense of matching, to select non-matching lines.
-f FILE, --file=FILE
              Obtain patterns from FILE, one per line.  The empty file contains zero patterns, and therefore matches nothing.

【讨论】:

选项-n可以添加到不同的行编号 有什么方法可以突出显示每行不匹配的部分? 有了这个你可以只找到第一个区别并打印它的行号:grep -m 1 -Fnxvf file1 file2 处理大文件效率很低。【参考方案2】:

你可以试试

grep -f file1 file2

grep -v -F -x -f file1 file2

【讨论】:

这行不通。尝试将dsfblah 添加到file2。 你可以用grep -F -x修复它 我认为您的建议值得编辑答案@tripleee 请注意,文件的顺序很重要。我正在尝试检测文件的新添加。我必须写grep -v -f oldfile newfile,否则它什么也不会输出。 想象一下:git add file1. git 提交。猫文件 2 > 文件 1。混帐差异。 ?【参考方案3】:

您可以使用comm 命令比较两个已排序的文件

comm -13 <(sort file1) <(sort file2)

【讨论】:

仅供参考,实际上是comm -1 -3 file1 file213 两个标志合并为一个。 comm -23 【参考方案4】:

我成功使用了

diff "$file1" "$file2" | grep "<" | sed 's/^<//g' > "$diff_file"

将差异输出到文件。

【讨论】:

有什么比使用差异工具更好的方法来发现差异哈哈。使用 this 与 grep 相比是否有更高的开销?【参考方案5】:

如果您希望它们按特定顺序排列,您可以使用diff

diff file1 file2 | grep "&gt;"

【讨论】:

【参考方案6】:
join -v 2 <(sort file1) <(sort file2)

【讨论】:

【参考方案7】:

A 尝试对Luca 的回答稍作改动,它对我有用。

diff file1 file2 | grep ">" | sed 's/^> //g' > diff_file

请注意,在 sed 中搜索到的模式是 &gt; 后跟一个空格。

【讨论】:

【参考方案8】: 文件1 米1 平方米 立方米 文件2 平方米 m4 m5 >awk 'NR == FNR file1[$0]++; next !($0 in file1)' file1 file2 m4 m5 >awk 'NR == FNR file1[$0]++; next ($0 in file1)' file1 file2 平方米 > 获取“m1 和 m3”的 awk 命令是什么?如在file1中而不是在file2中? 米1 立方米

【讨论】:

【参考方案9】:

如果你想使用循环,你可以这样尝试:(diff 和 cmp 效率更高。)

while read line
do
    flag = 0
    while read line2
    do
       if ( "$line" = "$line2" )
        then
            flag = 1
        fi
     done < file1 
     if ( flag -eq 0 )
     then
         echo $line > file3
     fi
done < file2

注意:该程序只是为了提供一个基本的见解,如果您不想使用系统调用,例如 diff n comm..

【讨论】:

【参考方案10】:

一个 awk 答案:

awk 'NR == FNR file1[$0]++; next !($0 in file1)' file1 file2

【讨论】:

【参考方案11】:

使用 GNU sed:

sed 's#[^^]#[&]#g;s#\^#\\^#g;s#^#/^#;s#$#$/d#' file1 | sed -f- file2

工作原理:

第一个sed 产生如下输出:

/^[d][s][f]$/d
/^[s][d][f][s][d]$/d
/^[d][s][f][s][d][f]$/d

然后它被第二个sed用作sed脚本。

【讨论】:

以上是关于查找两个文本文件之间的差异,每行一项[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Notepad++编辑器对文本行首、行尾加上固定字符;每行之间增加空行

python如何查找两个文本文件之间的所有单词匹配

SQL:查找按用户分组的最新两个记录之间的差异

awk 查找两个文件中第二个字段之间的差异

基于pyspark中仅一列的两个DataFrame之间的差异[重复]

使用python查找两个csv文件列之间的差异