用于获取序列并更改序列的Shell脚本?

时间:2009-10-10 07:46:26

标签: unix shell sed awk

我有一个像

这样的命令
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

我还有机会在0002之后收到0005 在这里,我认为0003和0004是缺失的序列。

我希望设置一个限制,以便设置前缀的值 范围从00-99,即值可以达到999999.所以 循环应该一直到9999收到99次 输入文件。

如何在shell脚本中完成?

2 个答案:

答案 0 :(得分:1)

我假设您的.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来填充字段。

答案 1 :(得分:0)

也许这个脚本有点帮助。但是丢失的文件和它们到达的顺序仍然存在问题。如果没有???? 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