RHEL6.10、gnu grep 2.2
grep -vfF stem.txt source.txt > filteredoutput.txt
stem.txt
数字は13個だけです。
source.txt
位置225から始まる13ビットフィールド値を持つ固定長(400)データファイル。フィールド値はファイル内で一意です。どちらの場合も、改行文字は行区切り文字です。
source.txt
stem.txt
行数は約80,000個、約4,500個です。
しかし、私の出力ファイルには約75,000行があります。これは、ステムファイルにあるよりも多くのコンテンツをフィルタリングしていることを意味します。
なぜこれが起こるのかわかりません。
source.txt
問題の解決中に、数値フィールドを除く各行の他のすべての項目を空白に置き換えて、正しい結果を得ました。非常に混乱した行動。
- どのように解決できるかわからないのですか?
- 他のオプションは何ですか? sed /awk と同じです。
編集:万歳grep!問題はユーザー/私にあります。誤って、私はソースファイルの他の場所に表示される可能性がある特別な13ビットシーケンスの可能性を考慮していません。 grepコマンドとそのパラメータは期待どおりに機能します。
答え1
を使用して、awk
これらの文字列が必要な場所でのみ見つけることができることを確認してください。
awk '!source {stem[$0]; next}
! (substr($0, 225, 13) in stem)
' stem.txt source=1 source.txt > filteredoutput.txt
(substr()
開始位置は1から始まります。)
source.txt
また、4,500 個の部分文字列検索ではなく、1 行につき 1 つのハッシュ検索のみを実行すればよいので、より効率的です。
気づく
grep -vfF stem.txt source.txt
はい
grep -v -f F stem.txt source.txt
(正規表現と一致しないファイルの行を見つけますstem.txt
)。source.txt
F
おそらく次の意味です。
grep -vFf stem.txt source.txt
(source.txt
文字列を含まない行を探しますstem.txt
)。
答え2
もう1つの方法は、次のEREsed
に対して225番目の位置から一致するEREを動的に生成することです。grep
grep -vEf <(sed 's/.*/^.{224}&/' stem.txt) source.txt
したがって、任意の場所で他の可能な一致が出力に影響を与えないように、特定の場所で一致を開始する必要があります。
grep
-v
なしで実行し、結果を比較して、他の場所で一致するものをテストすることもできますstem.txt
。