grepループ:あるファイルの各行をクエリとして使用して、別のファイルと一致するコンテンツを見つけます。出力が一貫していないのはなぜですか?

grepループ:あるファイルの各行をクエリとして使用して、別のファイルと一致するコンテンツを見つけます。出力が一貫していないのはなぜですか?

query_ids次のような複数行を含むファイルがあります。

id1
id2
id3

grep idxで一致するIDを見つけるために使用していますmy_file
これらの一致を新しいファイルにリダイレクトしますmatches。また、すべての不一致をファイルにリダイレクトするためにwithオプションを
使用しました。私はこの小さなスクリプトを使用しています。grep-vmismatches

#!/bin/bash


for i in $(cat query_ids)
do 
    # saving matches 
    grep "$i" my_file >> matches
    # saving mismatches
    grep -v "$i" my_file >> missing
done

明らかに何かが間違っているようです。
ファイルから一部のIDを手動で検索すると、そのIDが存在することがmissingわかりmy_fileました。ファイルには、
Iで見つからないmissingファイルのIDのみを含める必要がありますが、一致するものが見つかりました。query_idsmy_file

したがって、任意のIDが選択された場合はid3が通過し、両方がgrep id3 missing一致grep id3 my_fileを返すとします。 <br>

私のコードがmismatchesファイルにid3を割り当てるのはなぜですか?

  1. 周囲の引用符を削除しようとしましたが、$i結果は変更されませんでした。
  2. echo "$i"また、IDが実際に円形であることを確認しようとしました。

私は何を見逃していますか?

ベストアンサー1

たとえば、IDをインポートしてid1から、そのIDと一致するすべての行をにインポートするだけですmatches。次に、すべての行を抽出します。いいえに一致させてくださいmissing

次のIDの場合、id2そのIDと一致する行はに追加されmatches、一致しない行はid2に追加されますmissing

今すぐmissing含まれていないすべての行を含めてid1から、含まれていないすべての行を含めますid2。含まれる行id1と含まない行は、ループの2回目の反復にid2表示されます。missing

代わりに、すべてのIDを同時に考慮してください。

grep -f query_ids -Fw    my_file >matches
grep -f query_ids -Fw -v my_file >missing

ここでは、grepquery_idsをクエリ文字列(つまり正規表現ではない)として扱い、完全な単語(一致しないなど)で一致させるように-f要求します。grepquery_ids-Fmy_file-wid2id23

最初のコマンドは、IDを含むすべての行を抽出します。 2番目のコマンドは、IDを含まないすべての行を抽出します。

ここでは何のループも必要ありません。

おすすめ記事