我有2个文本文件,我需要将“更改”导出到新文件。这意味着第二个文件的行与第一个文件的行进行比较,如果在那里找不到行,那么它会将它附加到新的(第三个)文件。
第一个文件的内容是:
ABC 123 q1w2sd DEF 321 sdajkn GHI 123 jsdnaj JKL 456 jsd223
第二个文件包含:
ABC 123 XXXXXX JKL 456 jsd223 DEF XXX sdajkn GHI 123 jsdnaj
请注意,以ABC和DEF开头的行已更改。 JKL刚刚改变了它的位置。
输出文件应包含: ABC 123 XXXXXX DEF XXX sdajkn
如何使用'awk'或'sed'来做到这一点?
编辑:第二个文件中的新行也应计为更改..
答案 0 :(得分:4)
awk 'NR == FNR { f1[$0]; next } !($0 in f1)' file1 file2
用grep:
grep -Fvxf file1 file2
答案 1 :(得分:3)
假设第一个文件命名为:fileA
,第二个文件命名为:fileB
,您可以像这样使用awk:
awk 'NR==FNR {a[$1];b[$0];next} ($1 in a) && !($0 in b)' file{A,B}
或者简单地说:
awk 'NR==FNR {a[$1];b[$0];next} ($1 in a) && !($0 in b)' file1 file2
答案 2 :(得分:2)
GNU代码sed:
$sed 's#\(.*\)#/\1/d#' file1|sed -f - file2 ABC 123 XXXXXX DEF XXX sdajkn
这也会在file2
中处理“换行符”。
答案 3 :(得分:0)
使用comm
查找第二个文件中不在第一个文件中的行:
$ comm -13 <(sort first) <(sort second)
ABC 123 XXXXXX
DEF XXX sdajkn