Сценарий оболочки для получения последовательности и ее изменения? - PullRequest
0 голосов
/ 10 октября 2009

У меня есть команда типа

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 раз входной файл.

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

Ответы [ 2 ]

1 голос
/ 10 октября 2009

Я предполагаю, что ваши файлы .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 в конце для заполнения нулями полей.

0 голосов
/ 05 декабря 2009

Может быть, этот скрипт немного помогает. Но все еще есть проблема с отсутствующими файлами и порядком их поступления. Что делать, если файла 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...