複数のファイルから重複した行を削除する方法に関する質問があり、ここで便利なスクリプトを提供しました。ファイル構造を維持しながら、複数のJSONファイルから重複行を削除します。。
問題は、私のフォルダに10000個のファイルがあり、各ファイルのサイズが1.5MBであることです。スクリプトは数日間実行されましたが、完了していません。私のフォルダは次のとおりです。
file.1424-417982.json
file.1424-417995.json
file.1424-418013.json
file.1424-418015.json
file.1424-418019.json
file.1424-418027.json
(9994 more files)
重複した行は、指定された範囲内のファイルでのみ発生することが確認されました。上記の最初の4つのファイルには重複した行がある可能性がありますが、これらの行はフォルダ内の他のファイルには表示されません。同様に、ファイル2-5に重複がある可能性がありますが、他のファイルに重複がない可能性があります。 4つのファイル範囲で重複する項目のみを見つけるようにシェル/bashスクリプトを変更し、この操作を順番にほぼ10000回実行して範囲を1-4、2-5、3-6...9996-10000に変換するにはすべきですか? ?
重複する項目を見つけるために私に提供されたコードは次のとおりです。 6つのファイルしかないテストフォルダでテストしましたが、十分に高速でした。
#!/bin/bash
temp=$(mktemp)
for file_to_dedupe in $(echo *.json|sort)
do
for file_to_strip in *.json
do
[ "$file_to_dedupe" == "$file_to_strip" ] && continue
grep -w -Ff ${file_to_dedupe} -v ${file_to_strip} > ${temp}
mv ${temp} ${file_to_strip}
done
done
答え1
ファイルを4x4で繰り返すようにスクリプトを修正しました。約20個のファイルに対してテストした結果、正常に動作しているようです。このスクリプトはファイル名を配列に保存してから4x4で繰り返します。
temp=$(mktemp)
declare -a files=($(echo *.json|sort))
length=$(echo ${#files[@]})
for ((i=0;i<length;i++))
do
for ((j=0;j<=3;j++))
do
[ "${files[i]}" == "${files[i+j]}" ] && continue
[ "$((i+j))" -ge "$length" ] && continue
echo ${files[i]} ${files[i+j]}
#grep -w -Ff ${files[i]} -v ${files[i+j]} > ${temp}
#mv ${temp} ${files[i+j]}
done
done
私はここに出力していますecho
。正常に動作すると思われる場合は、コメントを削除してください。