
2つのファイルがあり、違いを見つけて、ex2に含まれていないものだけを出力したい
を使用するとgrep -Ff ex2.txt ex1.txt
、 と表示されますが a b c d
、 で同じコマンドを使用すると、-v
出力はありません。 では最初のコマンドも と出力されるのはなぜですかd
?
これを行う最も簡単な方法は何でしょうか? grep はこれに適していますか? diff や、各行を読み取って、それが存在するかどうかを出力するスクリプトなどでしょうか?
cat ex1.txt
a
b
c
d
cat ex2.txt
a
b
c
編集---出力は次のようになります:
cat ex2.txt
a
b
c
cat ex1.txt
a
b
c
d
grep -vf ex2.txt ex1.txt
grep -f ex2.txt ex1.txt
a
b
c
d
答え1
grep
は、ここでの作業に適したツールではありませんが、をざっと見てみるとgrep manpage
役に立つはずです (grep
ディストリビューションによって大きく異なることに注意してください。デフォルトで GNU を使用する場合もあれば、別のものを使用する場合もあるためです)。
- -F ... 固定文字列 (改行で区切る) - (カテゴリ: マッチャー選択)
- -f ... ファイル名 (カテゴリ: マッチング制御)
- -v ... 一致を反転 (カテゴリ: 一致制御)
grep -Fvf ex2.txt ex1.txt
次のようなものがうまくいくと想像するかもしれません。しかし、これは良い解決策ではないは、開始する前にファイルについてある程度の知識が必要であるためです。diff
ファイルやディレクトリ間のより具体的で正確な差異を示す、より優れたツール (のバリエーションなど) があります。
編集: Fire 文字列ではなく、固定文字列です (自動破損は気にしないでください)
答え2
ファイルの順序を変更してみてください:
grep -v -f ex2.txt ex1.txt
> d
答え3
エラーを再現できません:
cat ex2.txt
a
b
c
cat ex1.txt
a
b
c
d
grep -vf ex2.txt ex1.txt
d
grep -f ex2.txt ex1.txt
a
b
c
grep -Ff ex2.txt ex1.txt
a
b
c
grep -vFf ex2.txt ex1.txt
d
grep -V
grep (GNU grep) 2.20
lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description: Debian GNU/Linux 8.5 (jessie)
Release: 8.5
Codename: jessie
編集(OS X で BSD grep を使用する場合):
cat ex2.txt
a
b
c
cat ex1.txt
a
b
c
d
grep -f ex2.txt ex1.txt
a
b
c
grep -vf ex2.txt ex1.txt
d
grep -Ff ex2.txt ex1.txt
a
b
c
grep -v -Ff ex2.txt ex1.txt
d
grep -V
grep (BSD grep) 2.5.1-FreeBSD