2つのファイルがあります。
ファイル1
dsf
sdfsd
dsfsdf
ファイル2
ljljlj
lkklk
dsf
sdfsd
dsfsdf
ファイル2にはあるがファイル1にはないものを表示したいので、ファイル3は次のようになります。
ljljlj
lkklk
あなたが試すことができます
grep -f file1 file2
または
grep -v -F -x -f file1 file2
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.
comm
コマンドを使用して、ソートされた2つのファイルを比較できます
comm -13 <(sort file1) <(sort file2)
私は正常に使用しました
diff "${file1}" "${file2}" | grep "<" | sed 's/^<//g' > "${diff_file}"
差分をファイルに出力します。
特定の順序でそれらを期待している場合は、diff
を使用できます。
diff file1 file2 | grep ">"
join -v 2 <(sort file1) <(sort file2)
Aは Luca の答えを少し変えてみましたが、うまくいきました。
diff file1 file2 | grep ">" | sed 's/^> //g' > diff_file
Sedで検索されるパターンは、>
の後にスペースが続くことに注意してください。
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
ループを使用する場合は、次のように試すことができます(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などのシステムコールを使用したくない場合に実行できることに関する基本的な洞察を提供することのみを目的としています。
awkの答え:
awk 'NR == FNR {file1[$0]++; next} !($0 in file1)' file1 file2
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
スクリプトとして使用されます。