grepはどのように異なる数の一致を返しますか?

grepはどのように異なる数の一致を返しますか?

ファイル(24行)を2つのファイル(わずかに大きい)にgrepする必要があります。

ソースファイルには、次の文字列に似た24行が含まれています。

AATGGACGCTTAAC[A|C|T][A|C|G]CGGC[A|T]TCGGAT

私は次のことを行います。

grep -f aList hugeFile_N*.csv | wc -l
4396868

その後、すべてが正常であることを再確認するために、ファイルを2つのファイルに分割し、他のgrepを介して両方のファイルを使用しました。

cat aList | head -n 12 > firstHalf
cat aList | tail -n +13 > secondHalf
grep -f firstHalf hugeFile_N*.csv | wc -l
2169008
grep -f secondHalf hugeFile_N*.csv | wc -l
2228046

これで、2 つの個別の grep ファイルの一致の合計数が、元のファイルで見つかった一致の数と同じであることが予想されます。しかし、ご覧のように:

2169008 + 2228046 = 4397054
4397054 != 4396868

そうではありません。 186のゲームがありません。ここで何が起こっているのでしょうか?

私も(実際には非常に単純な)ファイルについていくつかの調査を行いました。ここでは、2つの別々の部分の結果を取得します。

grep -f <(cat firstHalf secondHalf) hugeFile_N*.csv > together

次に、2つの部分を別々に把握します。

grep -f firstHalf hugeFile_N*.csv > separately
grep -f secondHalf hugeFile_N*.csv >> separately

そして、前述したように、一致する回数も異なります。

wc -l together
4396868 together
wc -l separately
4397054 separately

ただし、一意の一致項目の数は同じです。

sort -u together | wc -l
3735836
sort -u separately | wc -l
3735836

興味深いことに、元のファイルの2つの部分をgrepすると、一致するものはまったくありません。なぜこれが起こるのか知りたいです。

grep -f ../code/firstHalf ../code/aList | wc -l
0
grep -f ../code/secondHalf ../code/aList | wc -l
0

エディタで見ることができるので、両方の部分が存在すると100%確信していますaList(各部分は12行になっていて肉眼で見にくくありません)。

何か間違っているような気がしますがgrep…何?

内部のすべての行はaList一意です。

ベストアンサー1

grep一致する行のみを検索最後のもの与えられたパターン。の24パターンのうち、aList前半に1つ、後半に1つが一致することがあります。これは、同じ行でgrep -f firstHalf一致するものを取得できることを意味しますgrep -f secondHalf。パターンリストの2つの部分を別々に実行すると、行が再計算されます。

例えば

$ cat test.txt 
abc 
foo
bar
foobar
$ cat patterns 
foo
bar
$ grep -c -f patterns  test.txt 
3

もちろん、次のようなものもあります。

$ grep -c -e foo test.txt
2
$ grep -c -e bar test.txt
2

そして2+2> 3です。

すべての行が一意の場合、一意に一致する行を計算することがこの効果を排除する1つの方法です。grep -n各出力ラインを一意にするために、出力にライン番号を追加できます。もちろん、基本的に一致するものは行のどこでも見つけることができることに注意してくださいgrep。あなたが望むものではない場合はそれを使うべきですgrep -x

また、これは[A|C|T]すべての文字またはと一致することを意味AしますC。パイプ文字の一致を望まない場合、または一致させる必要がない場合にのみ使用してください。または、置換が必要な場合は、拡張正規表現()を使用してから(角かっこではなく角括弧を使用)を使用する必要があります。しかし、すべての代替文字が単一文字である場合は、必要はありません。T|[ACT]grep -E(this|that)

おすすめ記事