"Ungrep" - 一致しないパターン

"Ungrep" - 一致しないパターン

以下を実行するコマンドまたはスクリプトを探しています。

ファイル1.txt:

abcd
efgh 
ijkl
mnop

ファイル2.txt:

123abcd123
123efgh123
123mnop123

次のコマンドが必要です。

ungrep file1.txt file2.txt

次を返します。

ijkl

つまり、file2.txtのgrepの結果を返さないfile1.txtの行を提供します。 file1.txtを繰り返し、各行に対してfile2.txtをgrepingし、結果を保存し、結果が空の行を出力することでこれを行うことができることを知っていますが、これを行うより効率的な方法ありますように。

答え1

GNUの場合、grep次のことが機能します。この-fオプションを使用すると、file1.txt「スキーマファイル」に渡されますが、データファイルに2番目のパスにすることもできます。-o一致する部品のみを報告するために使用されます。最後に、一度だけ一致する単語を抽出します。これはfile1.txt一致するものがない行に対応しますfile2.txt

grep -h -o -f  file1.txt file2.txt file1.txt | sort | uniq -u
ijkl

答え2

あなたはこれを行うことができますawk

awk '
  NR == FNR {w[$0]; next}
  {for (i in w) if (index($0,i)) delete w[i]}
  END {for (i in w) print i}' file1.txt file2.txt

を使用してindex正規表現と一致するのではなく、部分文字列を検索します。

一致するものが見つかると、配列からその単語を削除するので、不要な検索を避けることができます。

関連情報