查找两个文本文件之间的差异,每行一项[重复]
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 file2
。 1
和 3
两个标志合并为一个。
comm -23
【参考方案4】:
我成功使用了
diff "$file1" "$file2" | grep "<" | sed 's/^<//g' > "$diff_file"
将差异输出到文件。
【讨论】:
有什么比使用差异工具更好的方法来发现差异哈哈。使用 this 与 grep 相比是否有更高的开销?【参考方案5】:如果您希望它们按特定顺序排列,您可以使用diff
diff file1 file2 | grep ">"
【讨论】:
【参考方案6】:join -v 2 <(sort file1) <(sort file2)
【讨论】:
【参考方案7】:A 尝试对Luca 的回答稍作改动,它对我有用。
diff file1 file2 | grep ">" | sed 's/^> //g' > diff_file
请注意,在 sed 中搜索到的模式是 >
后跟一个空格。
【讨论】:
【参考方案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++编辑器对文本行首、行尾加上固定字符;每行之间增加空行