我有一个像
这样的命令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脚本中完成?
答案 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