diffを利用して、SQLのEXCEPTの結果のようなものを得たいとき、diffの結果には<
等が入るので整形が必要。
例えば、ある処理対象のパスの一覧が記載されているファイル(FILENAME)から除外対象のパスの一覧が記載されているファイル(EXC_FILENAME)を引き、対象パス一覧ファイル(TRGT_FILENAME)を作るとき、FILENAMEの中身からEXC_FILENAMEの中身を除去する。ただし、各ファイルの内容はソート済みとする。
diff FILENAME EXC_FILENAME | grep '^< ' | cut -d ' ' -f 2 > TRGT_FILENAME
diffで比べると消去したい文字列が列挙されている右側のファイルにない文字列(つまり最終的に残る文字列)が<
を文頭に伴った状態で残る。
grepで抜出し、cutで整形して出力する。
しかし、こんな面倒くさいことしなくてもcomm使えばいい。
comm -23 FILENAME EXC_FILENAME
commの説明はmanに書かれている通り
comm - compare two sorted files line by line
With no options, produce three-column output. Column one contains column two contains lines unique to FILE2, and column three contain files.
-1 suppress column 1 (lines unique to FILE1)
-2 suppress column 2 (lines unique to FILE2)
-3 suppress column 3 (lines that appear in both files)