2009-10-10 2 views
0

나는 나에게 000001의 출력을 줄 것이다시퀀스를 가져 와서 변경하는 쉘 스크립트?

echo "abcd0001gfh.DAT" | sed 's/^[^0-9]*\(....\).*$/\1/' | awk '{ print "00"$0 }' 

이 같은 명령을하지만 내가 0001-9999 에서 파일 이름을받을 경우 루프에서 이 실행하려면 다시 0001이된다. 그래서 내 출력은 내가 0002 후 0005을 받게되며 여기에 내가없는 시퀀스로 0003과 0004을 고려할 수있는 기회도 있습니다

abcd0001gfh.DAT 000001 
abcd0002gfh.DAT 000002 
. 
. 
. 
abcd9999gfh.DAT 009999 
abcd0001gfh.DAT 010001 
. 
. 
abcd9999gfh.DAT 019999 
abcd0001gfh.DAT 020001 

아래와 같이한다.

나는 한계가 입력 파일에 99 시간을 수신 00-99 예에서 범위는, 값은 999999까지 갈 수있는 접두사의 값이 그래서 루프가 9999까지 가야 있도록 설정하려면 .

어떻게 쉘 스크립트에서이 작업을 수행 할 수 있습니까?

답변

1

datfiles.list이라는 파일에 .DAT 파일 이름이 저장되어 있다고 가정합니다. 원하는 것은 새로운 추출 된 값이 이전보다 작을 때마다 접 두부를 증가시키는 것입니다.

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를 사용하여 필드를 0으로 채 웁니다.

+0

예 피터 ... 내 .DAT 파일 이름 난 다른 하나의 순차적 후 일부 시퀀스 수도 miss.so 어떤 경우에 파일을 수신 계속되고 여기에 문제 datfiles.list.but라는 파일에 저장 스크립트 shoudl 디렉토리를 폴링에 계속하고 그에 따라 순서를 제공합니다. 그래서 나는이 솔루션은 .. 비록 그것의 좋은 생각하지만 목적을 해결하지 않습니다. – Vijay

+0

누락 된 경우 스크립트가 시퀀스의 파일을 기다려야한다는 것을 의미합니까? – aktivb

0

아마도이 스크립트는 조금 도움이 될 것입니다. 그러나 누락 된 파일과 파일이 도착하는 순서에는 여전히 문제가 있습니다. ???? 9999.DAT 파일이 없으면 어떻게 될까요? $sequence은 증가하지 않습니다. 9.998.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