0

利用可能な同様の単語を見つけるために比較する 2 つの o/p ファイルがあります。ここにスクリプトの一部があります..

Bool=`grep "^$i" File1`
if [ -z "$Bool" ]
then
    echo " $i Not Available"
fi

両方のファイルに「profile$」という単語がありますが、これに対して「利用できません」という出力が得られます。一重引用符を試しましたが、両方のファイルで類似しているすべての単語が利用できないと表示されます。

ファイル 1 の出力

Shared_Docs
tools
tachqe8_rvl
profile$

ファイル 2 の出力

tools
tachqe8_rvl
profile$

ここでは、$iFile2 から各行を読み取り、grep を実行して File1 にあるかどうかを確認します。一致しない場合、エコー$iは利用できません。

理想的には、私のエコーは次のようになります。

Shared_Docs

しかし、私は得る

Shared_Docs
profile$

誰か助けてくれませんか?

4

2 に答える 2

0

変数$iに値が含まれていますprofile$か? だと仮定してみます。

単語の最後にあるドルは注意が必要です。変数がなければ、次のように書くことができます。

 Bool=$(grep '^profile\$' File1)

変数では$、メタ文字としての意味を抑制するトリックが必要です。

Bool=$(grep "^$i.*" File1)

$(...)(バッククォートとも呼ばれるバックティックと同等のものを使用するよりもはるかに優れていることに注意してください。)

また、もちろん、行全体を正確に にしたい場合はprofile、特別なトリックは必要ありません:

Bool=$(grep "^$i" File1)

正常に動作するはずです。


質問のクリーチャーフィープへの対処

while read -r i
do
    Bool=$(grep "^$i.*" File1)
    if [ -z "$Bool" ]
    then
        echo " $i Not Available"
    fi
done < File2

は、それ以外の-r場合に苦しむ可能性のあるいくつかの拡張を抑制します。シェルが気に入らない場合は、削除してください。通常はなくても大丈夫です。


それを行う別の方法

欠落している行を探していて、順序が重要でない場合は、両方File1を並べ替えてからFile2、 を使用commしてそれらを比較し、 にあるFile2が にないエントリを取得できますFile1bash「プロセス置換」が利用可能な場合は、次のようになります。

comm -13 <(sort File1) <(sort File2)

プロセス置換がない場合:

sort -o File1 File1
sort -o File2 File2
comm -13 File1 File2
于 2013-07-25T05:56:38.290 に答える
0

この問題は、"profile$" の末尾にある "$" が原因で発生します。「$」は行末アンカーですが、RE の最後にある場合にのみ、この特別な意味を持ちます。RE の最後に無害なものを追加します。たとえば、試してみてください

grep -i "^$i.*" ファイル1

于 2013-07-25T06:14:09.963 に答える