On Thu, Aug 31, 2006 at 03:19:37AM +0400, Alexey Tourbin wrote: > On Thu, Aug 31, 2006 at 02:48:51AM +0400, Alexey Tourbin wrote: > > $ cat ./optimize_package_list > > #!/bin/sh -ef > > . tmpdir.sh > > cd $TMPDIR > > rpm -q --qf '[%{REQUIRENAME}\t%{NAME}\n]' -- "$@" >qR > > rpm -q --qf '[%{PROVIDENAME}\t%{NAME}\n]' -- "$@" >qP > > awk '{print$2,$1}' qR |sort -u -k2,2 -k1,1 -o qR > > awk '{print$2,$1}' qP |sort -u -k2,2 -k1,1 -o qP > > #head -v qR qP > > join -j 2 -o '1.1 2.1' qR qP |sort -u >p2p > > tsort p2p >tsorted || [ -s tsorted ] > > #head -v p2p tsorted > > set -- `cat tsorted` > > for i in `seq 1 $(($#-1))`; do > > eval master="\$$i" > > К сожалению для i>9 эта конструкция не работает. > Т.е. i=$10 воспринимается шеллом как i=${1}0 и т.д. > То есть скрипт может лажаться при числе аргументов 10 и более. > Весь этот вложенный цикл нужно переписать на awk или на перле. :) --- optimize_package_list- 2006-08-30 23:31:38 +0000 +++ optimize_package_list 2006-08-31 04:00:46 +0000 @@ -9,17 +9,25 @@ awk '{print$2,$1}' qP |sort -u -k2,2 -k1 join -j 2 -o '1.1 2.1' qR qP |sort -u >p2p tsort p2p >tsorted || [ -s tsorted ] #head -v p2p tsorted -set -- `cat tsorted` -for i in `seq 1 $(($#-1))`; do - eval master="\$$i" - for j in `seq $((i+1)) $#`; do - eval slave="\$$j" - if grep -qs -Fx "$master $slave" p2p; then - #echo master=$master slave=$slave >&2 - echo "$slave" - fi - done -done >extrareq +awk -f - p2p >extrareq <<'EOF' +BEGIN { # process tsorted + while (getline <"tsorted") + tsorted[++N] = $1 +} +{ # process p2p + p2p[$1,$2] = 1 +} +END { # output unneeded reqs + for (i = 1; i < N; i++) { + master = tsorted[i] + for (j = i+1; j <= N; j++) { + slave = tsorted[j] + if (p2p[master,slave]) + print slave + } + } +} +EOF sort -o extrareq -u extrareq awk '{print$1}' qR |sort -u >req #head -v req extrareq