LINUX.ORG.RU

История изменений

Исправление kostik87, (текущая версия) :

#!/bin/sh
IN=/tmp/in

LINES=`wc -l $IN`
LINES=${LINES/ */}


LINE=`sed -n 1p $IN`
NUM_PREV=${LINE/,*/}
STR_PREV=${LINE/*,/}

for i in `seq 2 $LINES` 
do 
  LINE=`sed -n ${i}p $IN`
  NUM_CUR=${LINE/,*/}
  STR_CUR=${LINE/*,/}
  if [ ${STR_CUR} = ${STR_PREV} ]
  then
    NUM_PREV=$((${NUM_PREV} + ${NUM_CUR}))
  else
    echo ${NUM_PREV},${STR_PREV}
    NUM_PREV=${LINE/,*/}
    STR_PREV=${LINE/*,/}
  fi
done
echo ${NUM_PREV},${STR_PREV}

В файле /tmp/in указанные вами входные данные:

123,abcdf
100,abcdf
200,abcdf
100,xyzf
В качестве разделителя блоков используется запятая ",".

Исходная версия kostik87, :

#!/bin/sh
IN=/tmp/in

LINES=`wc -l $IN`
LINES=${LINES/ */}


LINE=`sed -n 1p $IN`
NUM_PREV=${LINE/,*/}
STR_PREV=${LINE/*,/}

for i in `seq 2 $LINES` 
do 
  LINE=`sed -n ${i}p $IN`
  NUM_CUR=${LINE/,*/}
  STR_CUR=${LINE/*,/}
  if [ ${STR_CUR} = ${STR_PREV} ]
  then
    NUM_PREV=$((${NUM_PREV} + ${NUM_CUR}))
  else
    echo ${NUM_PREV},${STR_PREV}
    NUM_PREV=${LINE/,*/}
    STR_PREV=${LINE/*,/}
  fi
done
echo ${NUM_PREV},${STR_PREV}