找到两个文本文件之间的差异,每行一个项目

时间:2010-11-02 15:01:52

标签: bash file scripting sed awk

我有两个文件:

档案1

dsf
sdfsd
dsfsdf

文件2

ljljlj 
lkklk 
dsf
sdfsd
dsfsdf

我想显示文件2中的内容,但不显示文件1中的内容,因此文件3应该显示为

ljljlj 
lkklk 

11 个答案:

答案 0 :(得分:131)

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.

答案 1 :(得分:46)

你可以尝试

grep -f file1 file2

grep -v -F -x -f file1 file2

答案 2 :(得分:38)

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

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

答案 3 :(得分:12)

我成功使用了

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

将差异输出到文件。

答案 4 :(得分:8)

如果您按照特定顺序预期,可以使用diff

diff file1 file2 | grep ">"

答案 5 :(得分:6)

join -v 2 <(sort file1) <(sort file2)

答案 6 :(得分:3)

我对Luca的回答略有不同,这对我有用。

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

请注意,sed中的搜索模式是>,后跟空格。

答案 7 :(得分:2)

file1 
m1
m2
m3

file2 
m2
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
m2

> What's awk command to get 'm1 and m3' ??  as in file1 and not in file2? 
m1
m3

答案 8 :(得分:1)

如果你想使用循环你可以尝试这样:( 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,可以做些什么。

答案 9 :(得分:1)

回答:

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

答案 10 :(得分:0)

使用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脚本。