
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と互換性があります。
答え2
GNU coreutilsは、(ソートされた)文字列セットで作業するためのツールを提供します。あなたの場合、grep
forループを放棄してcomm
代わりに使用することをお勧めします。
$ comm -23 uniq_val.out fd.out
ghi789
jkl101112
man comm
:
comm - 2つのソートされたファイルを1行ずつ比較します。
-2
キーはFILE1に固有の行のみ-3
を印刷します。comm
文字列やテーブルセットに使用できる他の便利なツールは、データを準備するために、およびtr
いくつかの簡単なタスクを実行するために使用することができます。これらのツールは and はもちろん、 universal 、 and よりも簡単です。sort
uniq
join
cut
paste
sed
grep
awk
perl
python