
以下を実行するコマンドまたはスクリプトを探しています。
ファイル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
正規表現と一致するのではなく、部分文字列を検索します。
一致するものが見つかると、配列からその単語を削除するので、不要な検索を避けることができます。