2012-01-20 9 views
0

これはばかげて簡単に行えるはずです。配列の要素をひとつだけ出力したいだけです。しかし、私がprint arr[1]のようなコマンドから得られるのは空の行です。アレイの単一要素を印刷する

#!/bin/bash 
find -X $1 -type f | 
xargs md5 | 
awk ' 

NF == 4 { 
    md5[$4]++; 
    files[$2]++; 
} 

END { 
    for (i = 1; i <= NF; i++) 
    for (j = i + 1; j <= NF; j++) 
     if (md5[i] == md5[j]) { 
      print "These are duplicates: " 
      print files[j+1] 
      print files[i] 
     } 

' 

exit 0 

はそれが非常に簡単に重複したファイルファインダーです:

は、ここに私の全体のbashスクリプトです。問題のある部分は、awk内のEND()ステートメントにあります。

これはちょうど私に「これらは重複しています。私は情報が利用可能であることを知っています。なぜなら、これをEND {}に追加します:for (x in arr); print xであり、期待通りにarrのすべての要素を完璧に印刷します。

私は何か非常に愚かなことをしているに違いない。

+0

あなたの配列は数値でインデックスされていますか? –

+0

私はそれがすべてのawk配列の仕組みだと思っていました。それらが数値的に索引付けされていない場合、どのように個々の要素を参照できますか? –

+0

上記のコード全体を見ることができるので、配列要素をインデックスするために何もしなかったことがわかります。それが自動的に起こらないなら、何とかそれを紹介する必要があります。 –

答えて

1

あなたが現在行っていることは、2つの配列のインデックスとして保存する値を割り当てることです。これはコード例の中では普通のようです(awk)。しかし、これは通常for (x in y)の構文と組み合わせて使用​​されます。あなたのコードを修正するには、何をやっている修正するために頭に浮かぶの方法は、そうのようなあなたのawkビットを変更することです。その後、

BEGIN { 
    md5idx = 0; 
    filesidx = 0; 
} 

と変更:についてそれを行う必要があります

NF == 4 { 
    md5[md5idx++] = $4; 
    files[filesidx++] = $2; 
} 

を、私は思うが、私はそれをテストしていない。

+0

私は非常にばかげたが無関係の間違いを作りました。私はiとjを<= length(md5) –

1

それは私自身の自家製のバージョンとは対照的に、標準md5を見つけるために、私はしばらく時間がかかったが、MacOS Xの10.7.2のバージョンからの出力例は次のとおりです。

その出力を想定し
$ /sbin/md5 $(which -a md5) 
MD5 (./md5) = 57f49e1c53ca7875fe63a33958ab0b0b 
MD5 (/Users/jleffler/bin/md5) = 57f49e1c53ca7875fe63a33958ab0b0b 
MD5 (/sbin/md5) = dd00b1dc4dd11c8443a70b5d33e0cade 
$ 

md5は、カラム4のハッシュとカラム2のファイル名で、名前の前後のカッコで囲まれています。また、ファイル名にスペースが含まれているため、名前にスペースが含まれていないと仮定します。おそらく次のようなものが必要です:

#!/bin/bash 
find -X "${@:-'.'}" -type f | 
xargs /sbin/md5 | 
awk ' 
NF == 4 { 
    if (file[$4] != "") printf "Duplicate: MD5 %s - %s & %s\n", $4, file[$4], $2; 
    else file[$4] = $2; 
}' 

exit 0 

出力例:それが行くよう

Duplicate: MD5 57f49e1c53ca7875fe63a33958ab0b0b - (./md5) & (/Users/jleffler/bin/md5) 

これは、重複したMD5値を識別します。指定されたMD5ハッシュの(連想配列)配列fileにエントリがない場合は、ファイル名とともにエントリが作成されます。エントリがある場合、MD5値と2つのファイル名が出力されます。フォーマットを議論することができます。フォーマットは3つのラインに分散されている方が、1つに窮屈になるよりも優れています。

"${@:-'.'}"は、コマンドライン引数がある場合はそれを使用することを意味します。それ以外の場合は、.(現在のディレクトリ) 'を使用します。これは、最初の引数(唯一)を使用し、引き数が指定されていない場合に失敗する場合よりも使用する可能性が高いようです。

2

変数を使用する代わりに、line numberを含むNRをインデックスとして使用して、配列にフィールド値を格納することもできます。

NF == 4 { 
    md5[NR]=$4; 
    files[NR]=$2; 
} 

してからEND部分には、あなたは、for (i=1;i<=NR;i++}のようなものを使用することができます。END statementにあなたは常に最後の行番号としてNRの値を持つことになり、以来、あなたは、配列の長さを見つけるために、任意の数またはawkのさえlength functionを使用する必要はありません。