sed または grep およびその他の vfF と同等のもの

sed または grep およびその他の vfF と同等のもの

RHEL6.10、gnu grep 2.2

grep -vfF stem.txt source.txt > filteredoutput.txt

stem.txt数字は13個だけです。

source.txt位置225から始まる13ビットフィールド値を持つ固定長(400)データファイル。フィールド値はファイル内で一意です。どちらの場合も、改行文字は行区切り文字です。

source.txtstem.txt行数は約80,000個、約4,500個です。

しかし、私の出力ファイルには約75,000行があります。これは、ステムファイルにあるよりも多くのコンテンツをフィルタリングしていることを意味します。

なぜこれが起こるのかわかりません。

source.txt問題の解決中に、数値フィールドを除く各行の他のすべての項目を空白に置き換えて、正しい結果を得ました。非常に混乱した行動。

  1. どのように解決できるかわからないのですか?
  2. 他のオプションは何ですか? 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.txtF

おそらく次の意味です。

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

関連情報