
query_ids
次のような複数行を含むファイルがあります。
id1
id2
id3
grep idx
で一致するIDを見つけるために使用していますmy_file
。
これらの一致を新しいファイルにリダイレクトしますmatches
。また、すべての不一致をファイルにリダイレクトするためにwithオプションを
使用しました。私はこの小さなスクリプトを使用しています。grep
-v
mismatches
#!/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_ids
my_file
したがって、任意のIDが選択された場合はid3が通過し、両方がgrep id3 missing
一致grep id3 my_file
を返すとします。 <br>
私のコードがmismatches
ファイルにid3を割り当てるのはなぜですか?
- 周囲の引用符を削除しようとしましたが、
$i
結果は変更されませんでした。 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
ここでは、grep
行query_ids
をクエリ文字列(つまり正規表現ではない)として扱い、完全な単語(一致しないなど)で一致させるように-f
要求します。grep
query_ids
-F
my_file
-w
id2
id23
最初のコマンドは、IDを含むすべての行を抽出します。 2番目のコマンドは、IDを含まないすべての行を抽出します。
ここでは何のループも必要ありません。