2016-10-21 7 views
0

テキストファイルの各行の3番目の単語(16進数文字列)を読み、16進数と比較しているときに問題が発生しています。誰かが私を助けてくれますか?私は以下を使用する場合でも、比較が正しく起こるbashスクリプトでHexを比較する

#!/bin/bash 
A=$1 

cat $A | while read a; do 
a1=$(echo \""$a"\" | awk '{ print $3 }') 
#echo $a > cut -d " " -f 3 
echo $a1 
(("$a1" == 0x10F7)) 
echo $? 
done 

a1= 0xADCAFE 
(("$a1" == 0x10F7)) 
echo $? 

その後、私は以下のように読んだとき、それは

a1=$(echo \""$a"\" | awk '{ print $3 }') 
or> a1=$(echo $a | awk '{ print $3 }') 

echo $aプリントが進値を意図し、問題を示している理由は、しかし、比較は起こりません。

よろしく、

+0

私はまだ間違っていることは間違いありません。私たちはスクリプトを単純化することから始めることができます。 'awk '{print $ 3}'" $ A "から始めてみてください。一方、読書a1; 'a1 = ...'行を削除します。また、スクリプトの出力を質問に追加してください。 – Eric

答えて

2

while readループ内Awkの実行アンチパターンです。 Awkでループを実行してください。それは良いことだ。あなたは、その値"0x10F7"ある文字列と比較する場合は、どちらかと一致する場合、それは

awk '$3 == "0x10F7"' "$1" 

awk '$3 == 4343' "$1" 

、ケース小文字を区別せずになど、正規表現はそれを行うための良い方法です。一方、二重引用符で$1は、シェルによって処理され、awkが実行される前に、スクリプトの最初のコマンドライン引数の(適切に引用された!)コピーによって置き換えられますか

awk '$3 ~ /^(0x10[Ff]7|4343)$/' "$1" 

お知らせ単一引用符でawkスクリプトそれ自身の名前空間を持っているので、$3は、現在の入力行の3番目のフィールドを参照するAwk変数です。

どちらの方法でも、ファイル名に二重引用符を含む引用符変数は常に常に常にとなります。useless use of catおよび

リテラルの二重引用符です。あなたは危険な裸の$aと二重引用符"\"$a\""の両方を試したようですが、ここでは簡単な"$a"が実際に欲しいものです。

+0

あなたの回答をありがとう、私のスクリプトはうまくいきました。 –

+0

この回答が役に立ちましたら、この問題を解決していないように[受諾](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)と考えてください。前もって感謝します! – tripleee

1

ありがとうございました。私のスクリプトはうまくいきました。私は2つのファイルを一致させようとしていましたが、スクリプトの目的はその目的を実行します。

#!/bin/bash 
A=$1 
B=$2 

dos2unix -f "$A" 
dos2unix -f "$B" 
rm search_match.txt search_data_match.txt search_nomatch.txt search_data_nomatch.txt 

while read line;do 
    search_word=$(echo $line | awk '{ print $1 }') 

    grep "$search_word" $B >> temp_file.txt 

    while read var;do 
     file1_hex=$(echo $line | awk '{ print $2 }') 
     file2_hex=$(echo $var | awk '{ print $3 }') 

     (("$file1_hex" == "$file2_hex")) 
     zero=$(echo $?) 
     if [ "$zero" -eq 0 ] ; then 

      echo $line >> search_match.txt 
      echo $var >> search_data_match.txt 
     else 
      echo $line >> search_nomatch.txt 
      echo $var >> search_data_nomatch.txt 
     fi 
    done < "temp_file.txt" 
    rm temp_file.txt 
done < "$A" 
+0

ファイル名の変数を正しく引用することはありません。あなたのスクリプトは '$ 1'や' $ 2'が空白や他のシェルのメタキャラクタを含むとすぐに失敗します。また、 '$ 1'と' $ 2'をすぐに他の変数に代入すると、それらの変数を実際に何かを意味するようにするのが良いでしょう。そうでなければ、あなたのスクリプトを通して '' $ 1 ''と' '$ 2" 'を使うこともできます。 – tripleee

+0

また、 'zero = $(echo $?)'は大量の[echo 'の無駄な使用]です(http://www.iki.fi/era/unix/award.html#echo)単純に 'if((" $ file1_hex "==" $ file2_hex "));その後...' – tripleee

+0

一時ファイルを持つ' grep'は、 'grep 'としてよりエレガントに表現されます。$ search_word" "$ 2" |一時ファイルを使わずにvarを読み込みます。 – tripleee

関連する問題