cmpの代わりにawkを使用して比較結果を変数に保存する方法

cmpの代わりにawkを使用して比較結果を変数に保存する方法

新しいファイルと古いファイルを比較して、ダウンロードしたファイルが重複していることを確認するcheckDuplicateDownload.shというファイルがあるとします。

これが私がすることです。

duplicate=`cmp $prevFile newFile -b`

duplicate結果を格納する変数cmpprevFileは古いファイル、newFileは新しいファイルです。ファイルが同じ場合、値は0 duplicate、それ以外の場合は1です。

上記のコマンドと同じことをcmp行いますが、awkを使用して比較をduplicate変数に保存するにはどうすればよいですか?

答え1

あなたが説明するのは、2つのファイルを自動的に比較するようです。最初のコードスニペットは終了ステータスをcmp変数に入れますduplicate(0 = match、そうでない場合は問題があります。man cmp終了ステータス値の詳細についてはこちらを参照)。

cmp -s prevFile newFile
duplicate=$?

しかし、次にやりたいことは、その価値をテストし$duplicateてそれに取り組むことです。この場合、終了cmp値を直接テストすることもできます。

if cmp -s prevFile newFile
then
    echo "Files match"
else
    echo "Files do not match (or one is missing, unreadable, etc.)"
fi

変数を使用する場合は、変数を使用するときに二重引用符で囲む必要があることを忘れないでください。

cmp -s "$prevFile" "$newFile"

$prevFileまた、まだ存在しないことが可能かどうかを検討してください。

最後に、どうですかawk?作業に適したツールではないので、ここでは使用しないでください。

答え2

これを使用できますawk。これを行うことはあまり意味がありません。ファイル比較用に特別に設計されたツールがあります(diffなど)。一方、任意の操作に使用できる強力なスクリプト言語です。したがって、実際にはこれらのツールの既存の機能を再実装することができますが、他のツールがよりうまくやっていることをより遅く効率的ではない方法で実行することを除いて、何の利点も得られません。cmpmd5sumawkawk

たとえば、awkプログラムは、2つのファイルが同じか異なるかを知らせます。

$ cat comp.awk
#!/usr/bin/awk -f

BEGIN{
  differ=0
}
NR==FNR{
  a[FNR]=$0; 
  last=FNR; 
  next
}
{ 
  if(FNR>last || "x"$0"x" != "x"a[FNR]"x" ){
    differ=1
    exit;
  }
} 
END{
  if(FNR<last){
    differ=1
  }
  print differ
}

したがって、これを使用して比較を変数に保存できます。

duplicate=$(comp.awk prevFile newFile)

変数は0ファイルが等しいか1どうかです。ただし、既存のツールを使用すると、同じ作業をより迅速、効率的、そしてより確実に実行できます。

duplicate=$(diff -q prevFile newFile)

もちろん、値は単純な1ORではなく、ORまたは空の文字列に0なりますが、実際の違いはありません。Files prevFile and newFile differおそらく後続のテストタスクでこの変数を使用したいと思います。

$ [[ -z $duplicate ]] && echo differ || echo same
differ

したがって、すでに存在しているよりも遅く、エラーが発生しやすく、面倒なバージョンを再作成することは無意味です。

関連情報