動作環境
CentOS Linux release 7.7.1908 (Core)
状況
- OpenMPで処理が遅いので、自分が考える最適な並列化に変更する
- そのためにはlsで読込むファイルリストを分割する方法が必要となる
分割対象ファイル
$ ls DATA/
inp.001 inp.002 inp.003 inp.004 inp.005 inp.006 inp.007 inp.008 inp.009 inp.010 inp.011 inp.012
環境変数とawkを使った分割例
$ INTVL=3 && INDX=1 && ls DATA/inp.0* | awk '(NR % '$INTVL' == '$INDX'){print $1}'
DATA/inp.001
DATA/inp.004
DATA/inp.007
DATA/inp.010
環境変数にするとパイプで渡す必要がなくなる。
bashスクリプト v0.1
loop_interval_191023_exec
loop_interval_191023_exec
#!/usr/bin/env bash
function myls ()
{
INTVL=$1 && INDX=$2 && ls DATA/inp.0* | awk '(NR % '$INTVL' == '$INDX'){print $1}'
}
if [ $# -lt 2 ];then
echo "[cmd] [interval] [start]"
echo "e.g."
echo "[cmd] 4 1"
exit
fi
INTERVAL=$1
START=$2
for elem in $(myls $INTERVAL $START);
do
echo $elem
done
実行例 > パラメータ不足
$ bash loop_interval_191023_exec
[cmd] [interval] [start]
e.g.
[cmd] 4 1
実行例 > パラメータ指定
$ bash loop_interval_191023_exec 4 1
DATA/inp.001
DATA/inp.005
DATA/inp.009
bashスクリプト v0.2
対象ファイルを指定できるように変更
loop_interval_191023_exec
#!/usr/bin/env bash
function myls_skipped ()
{
INTVL=$1 && INDX=$2 && ls $3* | awk '(NR % '$INTVL' == '$INDX'){print $1}'
}
if [ $# -lt 3 ];then
echo "[cmd] [interval] [start] [Dir/prefix]"
echo "e.g."
echo "[cmd] 4 1 DATA/inp.0"
exit
fi
INTERVAL=$1
START=$2
TARGET_DIR_WITH_PREFIX=$3
for elem in $(myls_skipped $INTERVAL $START $TARGET_DIR_WITH_PREFIX);
do
echo $elem
done
実行例 > パラメータ不足
$ bash loop_interval_191023_exec
[cmd] [interval] [start] [Dir/prefix]
e.g.
[cmd] 4 1 DATA/inp.0
実行例 > パラメータ指定
$ bash loop_interval_191023_exec 4 1 DATA/inp.0
DATA/inp.001
DATA/inp.005
DATA/inp.009
備考
$ bash loop_interval_191023_exec 4 1 DATA/inp.0*
のように使うとBrace Expansionにて展開された引数を関数mylsが受けることになり失敗する。
そのために上記のようにした。
関連
下記は上記の実装の先で使った情報。