Bourne ShellのTips

Bourne Shellに関して独立したページを設けるほどでもないTipsを記載します。

Bourne Shellの名前の由来

変わった名前のシェルですが、開発者の名前 Stephen R. Bourne からきているそうです。

関数の定義とシェルオプション

#!/bin/sh -x

function mvcut_data (){
# $1: file type (a, h, r)
# $2: file number (nnumX)
  if [ ! $# -eq 4 ]; then
    echo "[${0}] Four arguments must be specified."
    exit
  fi  
  cname="h010_l045_v001.190515"
  cnum="101"
  echo "processing $1 file"
  mv $cname.$cnum.${1}.${2}.nc $cname.$cnum.${1}org.${2}.nc
  ncks -d ocean_time,${3},${4} $cname.$cnum.${1}org.${2}.nc -o $cname.$cnum.${1}.$nnum0.nc
}

cname="h010_l045_v001.190515"
cnum="101"

### 070+071 -> 070 step1
nnum0=070
nnum1=071
#mvcut_data a $nnum0 0 2
#mvcut_data h $nnum0 0 2
mvcut_data r $nnum0 0 0 
  • 関数を定義する時は、上記のように function 関数名 () { }の形で記述します。
  • シェルスクリプト内の変数は基本的にグローバル変数で、引数として渡さなくても参照できます(逆にできてしまうので注意が必要です)。
  • シェルの実行時、あるいは関数の実行時の引数は、位置パラメータと呼ばれる特殊な変数に渡されます。位置パラメータの変数名は$1, $2, $3などです。
  • 位置パラメータの変数の数は$#という変数から参照することができます。
  • 変数名の区切りを明示するために、$1は${1}と書くことができます。

sedやawkを使った処理

#!/bin/sh

if [ ! $# -eq 1 ]; then
  echo "One argument must be specified."
  exit
fi

cname="h010_l045_v001.190515.101"
nnum=`printf %03d ${1}`

set a h r
while [ $# -ge 1 ]
do
  echo $1
  ncks -v ocean_time ${cname}.${1}.${nnum}.nc | \
  sed -n -e '/ocean_time = [0123456789]/p' | \
  awk '{n=split($0, ary, "="); print(ary[n])}' | \
  awk '{n=split($0, ary, ";"); print(ary[1])}' | \
  awk '{gsub (/ /,""); print }' |\
  awk '{n=split($0, ary, ","); for( i=1; i<=length(ary); i++ )  { printf("%.6f\n",ary[i]/86400/365.25) }}'
  echo ""
  shift
done
  • aaaa
  • aaa

ファイル名の部分きりだしと数値処理

#!/bin/sh -x

function cut_data (){
  # $1: file type (a, h, r)
  # $2: nnumX
  # $3: cut start
  # $4: cut end
  if [ ! $# -eq 4 ]; then
    echo "[${0}] Four arguments must be specified."
    exit
  fi
  nnum=$2
  echo "processing $1 file"
  mv -f $cname.$cnum.${1}.${nnum}.nc bak/$cname.$cnum.${1}.${nnum}.nc
  ncks -d ocean_time,${3},${4} bak/$cname.$cnum.${1}.${nnum}.nc -o $cname.$cnum.${1}.${nnum}.nc
}

function join_data_2 (){
  # $1: file type (a, h, r)
  if [ ! $# -eq 1 ]; then
    echo "[${0}] One argument must be specified."
    exit
  fi
  echo $cname
  echo $cnum
  mv -f $cname.$cnum.${1}.${nnum0}.nc bak/$cname.$cnum.${1}.${nnum0}.nc
  ncrcat bak/$cname.$cnum.${1}.${nnum0}.nc $cname.$cnum.${1}.${nnum1}.nc -o $cname.$cnum.${1}.${nnum0}.nc
}

function rewind_num (){
  # $1 file type (a, h, r)
  if [ ! $# -eq 1 ]; then
    echo "[${0}] One argument must be specified."
  fi
  mv ${cname}.${cnum}.${1}.${nnum0}.nc bak/${cname}.${cnum}.${1}.${nnum0}.nc 
  mv ${cname}.${cnum}.${1}.${nnum1}.nc ${cname}.${cnum}.${1}.${nnum0}.nc 
}

function copy_data (){
  # $1 file type (a, h, r)
  if [ ! $# -eq 1 ]; then
    echo "[${0}] One argument must be specified."
    exit
  fi
  cp ${cname}.${cnum}.${1}.${nnum0}.nc ../out/
}

### main ###

cname="h010_l045_v001.190515"
cnum="101"
nnum0="076"

mkdir -p bak

n=$(expr ${nnum0} + 1)
nnum1=$(printf "%03d\n" "${n}")

### 076+077 -> 076
#cut_data a $nnum0 0 2
#cut_data h $nnum0 0 2
#cut_data r $nnum0 0 0

#join_data_2 a
#join_data_2 h
#cut_data r $nnum1 0 0
#rewind_num r

#copy_data a
#copy_data h
#copy_data r
  • aaaa

特定のファイル番号だけ処理

#!/bin/sh

function get_fnum(){
  fname=$1
  fnum=`echo $fname | awk '{n=split($1, ary, "."); print(ary[5])}'`
  fnum=$((10#${fnum}))
}


## parameters
fnum_str=1
fnum_end=120

flist=`ls *.*.*.nc`

for f in $flist
do
  get_fnum $f
  if [ $fnum -ge $fnum_str ] && [ $fnum -le $fnum_end ]; then
    echo $f
    pigz -p 12 $f
  fi  
done
#!/bin/sh

function get_flist(){
# $1: filename
  ftype=`echo $1 | awk '{n=split($1,ary0,"."); print(ary0[4])}'`
  fnum=`echo  $1 | awk '{n=split($1,ary0,"."); print(ary0[5])}'`
  fnum=`echo $(( 10#$fnum ))`
}

###
cname="h010_l045_v001.190515.100"
flist=`ls ${cname}.?.*.nc.gz`

ftarget=""
for f in $flist:
do
  get_flist $f
  if [ $fnum -le 100 ] && [ $ftype = "a" -o $ftype = "h" -o $ftype = "r" -o $ftype = "s" ]; then
    ftarget=$ftarget" "$f
  fi  
done
du -c -m $ftarget

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA