通过两个文本文件中的特定模式获取差异文件
Posted
技术标签:
【中文标题】通过两个文本文件中的特定模式获取差异文件【英文标题】:Get a difference file by specific patterns in two text files 【发布时间】:2013-06-22 11:35:26 【问题描述】:我有 2 个文本文件,我需要将“更改”导出到一个新文件。这意味着将第二个文件的行与第一个文件的行进行比较,如果在那里找不到行,那么它将把它附加到新的(第三个)文件中。
第一个文件的内容是:
ABC 123 q1w2sd DEF 321 sdajkn GHI 123 杰斯德纳伊 JKL 456 jsd223第二个文件包含:
ABC 123 XXXXXX JKL 456 jsd223 DEF XXX sdajkn GHI 123 杰斯德纳伊请注意,以 ABC 和 DEF 开头的行已更改。 JKL 刚刚改变了它的位置。
输出文件应包含: ABC 123 XXXXXX DEF XXX sdajkn
如何使用 'awk' 或 'sed' 做到这一点?
编辑:第二个文件中的新行也应计为更改..
【问题讨论】:
【参考方案1】:假设第一个文件命名为:fileA
,第二个文件命名为:fileB
,您可以像这样使用 awk:
awk 'NR==FNR a[$1];b[$0];next ($1 in a) && !($0 in b)' fileA,B
或者简单地说:
awk 'NR==FNR a[$1];b[$0];next ($1 in a) && !($0 in b)' file1 file2
【讨论】:
您是否将每行的第一列存储到“a”和“b”中?我试图理解.. b[$0] 表示第 0(第一)列被存储到“b”?谢谢 我忘了提一件事。此外,添加到第二个文件中的新行也应计为更改。与第一个文件相比,基本上所有内容都是新的或更新的。 是的,我可能想通了。我需要这个: awk 'NR==FNR a[$0];b[$1];c[$2];next (($0 in a ) && (!($1 in b) || !($2 in c))) || !($0 in a)' fileA fileB 非常感谢您的帮助,您让我走上了正确的道路。答案非常接近。 +1 @Dropout:不客气。抱歉,我不在电脑旁,无法立即回复您的问题。很高兴看到您的问题得到解决。【参考方案2】:awk 'NR == FNR f1[$0]; next !($0 in f1)' file1 file2
使用 grep:
grep -Fvxf file1 file2
【讨论】:
这不是只比较第一列吗? 不,它比较整行。 @Dropout Inawk
$0
是整行。 $1
是第一列,$2
是第二列,依此类推...
哇,这真的很清楚。当任何行中的任何更改将其导出到第三个文件时,我为什么要一一检查每一列。很好的答案! :)
@JS웃 谢谢,这正是我直到现在才明白的事情 +1【参考方案3】:
GNU 代码sed:
$sed 's#\(.*\)#/\1/d#' file1|sed -f - file2 ABC 123 XXXXXX DEF XXX sdajkn这也处理file2
中的“换行符”。
【讨论】:
【参考方案4】:使用comm
在第二个文件中查找不在第一个文件中的行:
$ comm -13 <(sort first) <(sort second)
ABC 123 XXXXXX
DEF XXX sdajkn
【讨论】:
以上是关于通过两个文本文件中的特定模式获取差异文件的主要内容,如果未能解决你的问题,请参考以下文章