ファイルが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