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

Unix 获取并更改序列的Shell脚本?,unix,shell,sed,awk,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.DA

我有这样的命令

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。所以 循环应一直运行,直到在中收到99次9999为止 输入文件


如何在shell脚本中实现这一点?

我假设您的.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;
lastSeq=0;
前缀=0;
用于“cat datfiles.list”中的名称;做
seq=`echo$name | sed's/^[^0-9]*\(....).$/\1/''awk'{print“00”$0}'`
如果[[$seq<$lastSeq]];然后
前缀=$($前缀+1));
fi
lastSeq=$seq;
printf“%02d%06d\n”$prefix$seq
完成;

这似乎可以产生您想要的输出。请注意,在字段末尾使用printf来填充字段。

也许这个脚本有点帮助。但是丢失的文件和它们到达的顺序仍然存在问题。如果没有???9999.DAT文件怎么办<代码>$sequence不会递增。如果9999.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

是的,Peter…我的.DAT文件名存储在一个名为datfiles.list的文件中。但这里的问题是,我一直按顺序一个接一个地接收文件,在某些情况下,某些序列也可能丢失。因此脚本应该继续轮询目录并相应地给出序列。因此,我认为此解决方案…尽管很好,但确实如此解决目的。您的意思是,如果缺少文件,脚本应该在序列中等待该文件吗?