Сценарий оболочки для получения последовательности и ее изменения?

у меня есть такая команда

echo "abcd0001gfh.DAT" | sed 's/^[^0-9]*\(....\).*$/\1/' | awk '{ print "00"$0 }'

Это даст мне вывод 000001. Но я хочу запустить это в цикле, где я получаю имя файла от 0001-9999, и снова оно становится 0001. Так что мой вывод должен быть ниже

abcd0001gfh.DAT 000001
abcd0002gfh.DAT 000002
.
.
.
abcd9999gfh.DAT 009999
abcd0001gfh.DAT 010001
.
.
abcd9999gfh.DAT 019999
abcd0001gfh.DAT 020001

Также есть шанс, что я получу 0005 после 0002 и здесь я считаю 0003 и 0004 пропущенными последовательностями.

Я хочу, чтобы было установлено ограничение, чтобы значение префикса находилось в диапазоне от 00 до 99, т. Е. Значение может доходить до 999999. Таким образом, цикл должен продолжаться до тех пор, пока 9999 не будет получено во входном файле 99 раз.

Как это можно сделать в сценарии оболочки?


person Vijay    schedule 10.10.2009    source источник


Ответы (2)


Я предполагаю, что ваши имена файлов .DAT хранятся в файле с именем datfiles.list. Что вы хотите, так это увеличивать префикс каждый раз, когда новое извлеченное значение меньше предыдущего.

lastSeq=0;
prefix=0;
for name in `cat datfiles.list`; do 
    seq=`echo $name | sed 's/^[^0-9]*\(....\).*$/\1/' | awk '{ print "00"$0 }'`
    if [[ $seq < $lastSeq ]]; then
        prefix=$(($prefix+1));
    fi
    lastSeq=$seq;
    printf "%02d%06d\n" $prefix $seq
done;

Кажется, это дает желаемый результат. Обратите внимание на использование printf в конце для заполнения полей нулями.

person Igor Serebryany    schedule 10.10.2009
comment
Да, Питер... мои имена файлов .DAT хранятся в файле с именем datfiles.list. но проблема здесь в том, что я продолжаю получать файлы один за другим последовательно, и в некоторых случаях некоторые последовательности также могут отсутствовать. поэтому скрипт должен продолжать опрос каталог и укажите последовательность соответственно. Поэтому я думаю, что это решение ... хотя оно и хорошее, но решает цель. - person Vijay; 11.10.2009
comment
Вы имеете в виду, что скрипт должен ждать файл в последовательности, если он отсутствует? - person aktivb; 31.07.2013

Может этот скрипт немного поможет. Но остается проблема с отсутствующими файлами и порядком их поступления. Что делать, если не будет файла ????9999.DAT? $sequence не будет увеличиваться. Что делать, если ????9998.DAT приходит после ????9999.DAT? $sequence уже будет увеличено. Но, возможно, вы найдете решение для этого. И последнее, но не менее важное: если вы будете использовать код, вам нужно что-то для обновления файла .ts при разрыве цикла. Вы также можете переместить вычисляемые файлы в другой каталог.

#!/usr/bin/ksh

datadir=/home/cheko/tmp/test/datloop/data
ts=$datadir/.ts
latest=$datadir/.ts
timeout=20

if [ -f $ts ]
then
    sequence=`cat $ts`
else
    sequence=0
    echo $sequence > $ts
    touch -t 197001011212 $ts
fi

while true
do
    for file in `find $datadir -type f -newer $latest`
    do
        file=`basename $file`
        number=`echo $file | sed -n 's/^.*\([0-9]\{4,4\}\)\.DAT/\1/p'`
        echo $number
        printf "%-20s %02d%s\n" $file $sequence $number
        if [ "$number" = "9999" ]
        then
            sequence=$((sequence+1))
            echo $sequence > $ts
        fi
    done
    latest=$datadir/$file
    sleep $timeout
done
person user224243    schedule 04.12.2009