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