2つのファイルがあります。
- 私が探したい値がいっぱいのファイル
- マイソーステキストファイル
私は値のリストを繰り返し、ソースファイルに対してgrepを実行するショートシェルコマンドを書いた。ファイルに値が見つからない場合は、値を印刷したいと思います。
問題は、すべての値を印刷するため、値を正しくgrepしないため、常に一致せずに値を印刷することです。誰かが私が間違っていることを教えてくれることを願っています。よろしくお願いします。
これは私のスクリプトです。
for i in `cat uniq_val.out`
do
found=`grep "$i" fd.out`
if [ -z "${found}" ]
then
echo $i
fi
done
たとえば、私のuniq_val.outに次のものが含まれているとします。
abc123
def456
ghi789
jkl101112
mno131415
私のfd.outには次の内容が含まれています。
abc123
def456
mno131415
私のシェルスクリプトを返したい
ghi789
jkl101112
ベストアンサー1
次のようなさまざまなアプローチをお勧めします。
grep -f <(grep -o -f uniq_val.out fd.out) -v uniq_val.out
つまり、内部的にはパターンファイルgrep
として機能し、一致する部分のみを返します。外部的には、grepはリスト内のこれらの値の逆数を実行します。uniq_val.out
grep
しかし、私が知っている限り、-o
これはPOSIXではありません。
編集する次の問題があるサンプルファイル:
両方のファイルが実際に一致のみが必要な1行の文字列である場合は、パターンファイルのロジックを逆に置き換え、完全行-x
一致を使用します。
grep -vx -f fd.out uniq_val.out
これはPOSIXと互換性があります。