新しいファイルと古いファイルを比較して、ダウンロードしたファイルが重複していることを確認するcheckDuplicateDownload.shというファイルがあるとします。
これが私がすることです。
duplicate=`cmp $prevFile newFile -b`
はduplicate
結果を格納する変数cmp
、prevFile
は古いファイル、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
など)。一方、任意の操作に使用できる強力なスクリプト言語です。したがって、実際にはこれらのツールの既存の機能を再実装することができますが、他のツールがよりうまくやっていることをより遅く効率的ではない方法で実行することを除いて、何の利点も得られません。cmp
md5sum
awk
awk
たとえば、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)
もちろん、値は単純な1
ORではなく、ORまたは空の文字列に0
なりますが、実際の違いはありません。Files prevFile and newFile differ
おそらく後続のテストタスクでこの変数を使用したいと思います。
$ [[ -z $duplicate ]] && echo differ || echo same
differ
したがって、すでに存在しているよりも遅く、エラーが発生しやすく、面倒なバージョンを再作成することは無意味です。