4

我有 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”来做到这一点?

编辑:第二个文件中的新行也应计为更改..

4

4 回答 4

4
awk 'NR == FNR { f1[$0]; next } !($0 in f1)' file1 file2

使用 grep: grep -Fvxf file1 file2

于 2013-06-25T15:54:27.040 回答
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
于 2013-06-25T15:27:53.970 回答
2

GNU 的代码:

$sed 's#\(.*\)#/\1/d#' file1|sed -f - file2
ABC 123 XXXXXX
DEF XXX sdajkn

这也处理file2.

于 2013-06-25T21:29:58.843 回答
0

用于comm在第二个文件中查找不在第一个文件中的行:

$ comm -13 <(sort first) <(sort second)
ABC 123 XXXXXX
DEF XXX sdajkn
于 2013-06-30T11:37:47.773 回答