web-dev-qa-db-ja.com

1行に1つの項目がある2つのテキストファイルの違いを見つける

2つのファイルがあります。

ファイル1

dsf
sdfsd
dsfsdf

ファイル2

ljljlj 
lkklk 
dsf
sdfsd
dsfsdf

ファイル2にはあるがファイル1にはないものを表示したいので、ファイル3は次のようになります。

ljljlj 
lkklk 
75
vehomzzz

あなたが試すことができます

grep -f file1 file2

または

grep -v -F -x -f file1 file2
46
krico
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.
135
dogbane

commコマンドを使用して、ソートされた2つのファイルを比較できます

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

私は正常に使用しました

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

差分をファイルに出力します。

12
Luca Borrione

特定の順序でそれらを期待している場合は、diffを使用できます。

diff file1 file2 | grep ">"

8
Nate
join -v 2 <(sort file1) <(sort file2)
6

Aは Luca の答えを少し変えてみましたが、うまくいきました。

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

Sedで検索されるパターンは、>の後にスペースが続くことに注意してください。

3
 file1 
 m1 
 m2 
 m3 
 
 file2 
 m2 
 m4 
 m5 
 
> awk 'NR == FNR {file1 [$ 0] ++; next}!(file1の$ 0) 'file1 file2 
 m4 
 m5 
 
> awk' NR == FNR {file1 [$ 0] ++; next}(file1に$ 0) 'file1 file2 
 m2 
 
>' m1 and m3 'を取得するawkコマンドとは?? file2ではなくfile1のように? 
 m1 
 m3 
2
Chals

ループを使用する場合は、次のように試すことができます(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などのシステムコールを使用したくない場合に実行できることに関する基本的な洞察を提供することのみを目的としています。

1
letsc

awkの答え:

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

1
glenn jackman

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

次に、2番目のsedによってsedスクリプトとして使用されます。

0
Jahid