【问题标题】:Shell script for getting the sequence and changing it?用于获取序列并更改它的 Shell 脚本?
【发布时间】:2009-10-10 07:46:25
【问题描述】:

我有一个类似的命令

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 脚本中完成?

【问题讨论】:

    标签: unix shell sed awk


    【解决方案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 对字段进行零填充。

    【讨论】:

    • 是的,彼得...我的 .DAT 文件名存储在一个名为 datfiles.list 的文件中。但这里的问题是我不断按顺序接收文件,在某些情况下,某些序列也可能会丢失.so脚本应该继续轮询目录并相应地给出序列。所以我认为这个解决方案..尽管它很好但确实解决了目的。
    • 你的意思是脚本如果丢失了应该等待序列中的一个文件吗?
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-23
      • 1970-01-01
      • 1970-01-01
      • 2012-11-25
      相关资源
      最近更新 更多