@related: [[arpalhands]] [[bash]]
#! /bin/bash
function check_input
{
nb=$(wc -c ${file_set2[0]} ${file_set2[*]} \
| awk '{print $1}' | sed '$d' | sort -u | wc -l)
[ ${nb} != 1 ] && echo "Error: All input files must have same size !"
[ ${nb} = 1 ]
}
if [ ${#} -lt 3 ]
then
cat << EOF
Usage: ${0##*/} element_size infile1 [ infile2 ... infileN ] outfile
element_size : size in bytes of element to read in each input files
EOF
exit
fi
element_size="${1}"
shift
file_set=("${@}")
idx=0
while [ 0${idx} -lt 0$((${#file_set[*]}-1)) ] ; do
file_set2[idx]="$(mktemp)"
xxd -c ${element_size} -p "${file_set[idx]}" > "${file_set2[idx]}"
((++idx))
done
check_input && paste -d '\n' ${file_set2[*]} \
| xxd -p -r > "${file_set[$((${#file_set[*]}-1))]}"
rm -f "${file_set2[*]}"
====== Contexte ======
J'ai N tableaux.
Chacun de ces N tableaux n'ayant pas forcément la même taille.
Le but est de fournir une plage d'index pour chacun des N tableaux et que le programme calcule la combinatoire.
Exemple:\\
array1=(a b)\\
array2=(c d e)\\
array3=(f g h i)
Donc 3 plages d'index :\\
{0,1}\\
{0,1,2}\\
{0,1,2,3}
Imaginons que je sois intéressé par :\\
le premier index pour le premier tableau\\
les index 1 et 2 pour le 2e\\
les index 0, 1 et 2 pour le dernier
en bash : compute_indexes 0 {1,2} {0..2}\\
la sortie : 0 1 0 0 1 1 0 1 2 0 2 0 0 2 1 0 2 2 \\
si je l'affiche par triplets :\\
0 1 0\\
0 1 1\\
0 1 2\\
0 2 0\\
0 2 1\\
0 2 2
====== Code ======
expand_user_input()
{
local idxs=()
local idx
for ((idx=0; idx<${#REPLY[@]}; ++idx))
do
REPLY[idx]="$(eval echo ${REPLY[idx]})"
idxs+=(0)
done
iterator()
{
local idx=-1
while ((-${#REPLY[@]} <= ${idx}))
do
local tmp=(${REPLY[idx]})
idxs[idx]=$(((idxs[idx]+1)%${#tmp[@]}))
[ ${idxs[idx--]} -ne 0 ] && return
done
false
}
local result
while true
do
for ((idx=0; idx<${#REPLY[@]}; ++idx))
do
local tmp=(${REPLY[idx]})
result+="${tmp[${idxs[idx]}]} "
done
iterator || break
done
echo "${result}"
}
====== Comment s'en sert-on ? ======
Cas N=4\\
REPLY=(\{0..10\} 2 3 4)\\
expand_user_input
0 2 3 4 1 2 3 4 2 2 3 4 3 2 3 4 4 2 3 4 5 2 3 4 6 2 3 4 7 2 3 4 8 2 3 4 9 2 3 4 10 2 3 4
Cas N=4\\
REPLY=(\{0,10\} 2 3 4)\\
expand_user_input
0 2 3 4 10 2 3 4
Cas N=4\\
REPLY=(\{0,2\} 2 \{1,3,5\} 4)\\
expand_user_input
0 2 1 4 0 2 3 4 0 2 5 4 2 2 1 4 2 2 3 4 2 2 5 4
Cas N=5\\
REPLY=(\{0,2\} \{1,3,5\} \{4,6\} \{7,9,11\} \{8,10,12,14\})\\
expand_user_input
0 1 4 7 8 0 1 4 7 10 0 1 4 7 12 0 1 4 7 14 0 1 4 9 8 0 1 4 9 10 0 1 4 9 12 0 1 4 9 14 0 1 4 11 8 0 1 4 11 10 0 1 4 11 12 0 1 4 11 14 0 1 6 7 8 0 1 6 7 10 0 1 6 7 12 0 1 6 7 14 0 1 6 9 8 0 1 6 9 10 0 1 6 9 12 0 1 6 9 14 0 1 6 11 8 0 1 6 11 10 0 1 6 11 12 0 1 6 11 14 0 3 4 7 8 0 3 4 7 10 0 3 4 7 12 0 3 4 7 14 0 3 4 9 8 0 3 4 9 10 0 3 4 9 12 0 3 4 9 14 0 3 4 11 8 0 3 4 11 10 0 3 4 11 12 0 3 4 11 14 0 3 6 7 8 0 3 6 7 10 0 3 6 7 12 0 3 6 7 14 0 3 6 9 8 0 3 6 9 10 0 3 6 9 12 0 3 6 9 14 0 3 6 11 8 0 3 6 11 10 0 3 6 11 12 0 3 6 11 14 0 5 4 7 8 0 5 4 7 10 0 5 4 7 12 0 5 4 7 14 0 5 4 9 8 0 5 4 9 10 0 5 4 9 12 0 5 4 9 14 0 5 4 11 8 0 5 4 11 10 0 5 4 11 12 0 5 4 11 14 0 5 6 7 8 0 5 6 7 10 0 5 6 7 12 0 5 6 7 14 0 5 6 9 8 0 5 6 9 10 0 5 6 9 12 0 5 6 9 14 0 5 6 11 8 0 5 6 11 10 0 5 6 11 12 0 5 6 11 14 2 1 4 7 8 2 1 4 7 10 2 1 4 7 12 2 1 4 7 14 2 1 4 9 8 2 1 4 9 10 2 1 4 9 12 2 1 4 9 14 2 1 4 11 8 2 1 4 11 10 2 1 4 11 12 2 1 4 11 14 2 1 6 7 8 2 1 6 7 10 2 1 6 7 12 2 1 6 7 14 2 1 6 9 8 2 1 6 9 10 2 1 6 9 12 2 1 6 9 14 2 1 6 11 8 2 1 6 11 10 2 1 6 11 12 2 1 6 11 14 2 3 4 7 8 2 3 4 7 10 2 3 4 7 12 2 3 4 7 14 2 3 4 9 8 2 3 4 9 10 2 3 4 9 12 2 3 4 9 14 2 3 4 11 8 2 3 4 11 10 2 3 4 11 12 2 3 4 11 14 2 3 6 7 8 2 3 6 7 10 2 3 6 7 12 2 3 6 7 14 2 3 6 9 8 2 3 6 9 10 2 3 6 9 12 2 3 6 9 14 2 3 6 11 8 2 3 6 11 10 2 3 6 11 12 2 3 6 11 14 2 5 4 7 8 2 5 4 7 10 2 5 4 7 12 2 5 4 7 14 2 5 4 9 8 2 5 4 9 10 2 5 4 9 12 2 5 4 9 14 2 5 4 11 8 2 5 4 11 10 2 5 4 11 12 2 5 4 11 14 2 5 6 7 8 2 5 6 7 10 2 5 6 7 12 2 5 6 7 14 2 5 6 9 8 2 5 6 9 10 2 5 6 9 12 2 5 6 9 14 2 5 6 11 8 2 5 6 11 10 2 5 6 11 12 2 5 6 11 14