約1000行の大きなファイルrun_simulation.cshがあります。
#!/bin/csh
set config_dir = /proj/ABC/users/nhannguyen/work/verif/qc/input
set testbench_dir = /proj/ABC/users/nhannguyen/work/verif/qc/testbench/TT_p025c
bsub $testbench_dir/cell/delay_0_0.sp.py -c $config_dir/sim.config.py -m 1
bsub $testbench_dir/cell/delay_0_1.sp.py -c $config_dir/sim.config.py -m 1
bsub $testbench_dir/cell/delay_0_2.sp.py -c $config_dir/sim.config.py -m 1
bsub $testbench_dir/cell/delay_0_3.sp.py -c $config_dir/sim.config.py -m 1
bsub $testbench_dir/cell/delay_1_0.sp.py -c $config_dir/sim.config.py -m 1
bsub $testbench_dir/cell/delay_1_1.sp.py -c $config_dir/sim.config.py -m 1
bsub $testbench_dir/cell/delay_1_2.sp.py -c $config_dir/sim.config.py -m 1
bsub $testbench_dir/cell/delay_1_3.sp.py -c $config_dir/sim.config.py -m 1
...............
このファイルを50行の小さなファイルに分割したいので、大きなファイルrun_simulation.cshの最初の3行が必要です。可能であれば、これらの小さなファイルの拡張子は.cshです。この分割をどのように実行しますか?コマンドで?
#!/bin/csh
set config_dir = /proj/ABC/users/nhannguyen/work/verif/qc/input
set testbench_dir = /proj/ABC/users/nhannguyen/work/verif/qc/testbench/TT_p025c
答え1
#!/bin/bash
# step 1: Remove the header:
tail -n +4 ./bigfile.csh > bigfile_without_header.csh
# step 2: Split the file:
split -d -l 1000 --additional-suffix=.csh ./bigfile_without_header.csh split-
# step 3: Add the header back to each file:
HEADER='#!/bin/csh\nset config_dir = /proj/ABC/users/nhannguyen/work/verif/qc/input\nset testbench_dir = /proj/ABC/users/nhannguyen/work/verif/qc/testbench/TT_p025c\n'
sed -i "1s,^,$HEADER," split-*.csh
答え2
簡単な例として、テストは次のようになりますbash
。
#! /bin/bash
# first sub file index
j=1
# first line after header
i=4
# 50 lines per sub file
lines=50
# lines in file to split
total_lines=$(cat file_to_cut | wc -l)
while [ $i -lt $total_lines ]
do
# copy header
head -n 3 example > sub_file_$j
# copy data
tail -n +$i fite_to_cut | head -n $lines >> sub_file_$j
# prepare next file
j=$((j+1))
# prepare next line to read
i=$((i+$lines))
done
答え3
bsub
パターンに一致するすべてのスクリプトが必要であると仮定すると、"$testbench_dir"/cell/delay_*_*.sp.py
スクリプトを次のように置き換えることができます。
#!/bin/sh
config_dir=/proj/ABC/users/nhannguyen/work/verif/qc/input
testbench_dir=/proj/ABC/users/nhannguyen/work/verif/qc/testbench/TT_p025c
for py in "$testbench_dir"/cell/delay_*_*.sp.py; do
bsub "$py" -c "$config_dir/sim.config.py" -m 1
done
/bin/sh
台本ではなく台本ですが、それcsh
は問題ではありません。
スクリプトが特定の順序で実行されていることを確認する必要がある場合(上記の方法ではスクリプトファイルをアルファベット順に並べ替えます)、ダブルループを実行します。
#!/bin/sh
config_dir=/proj/ABC/users/nhannguyen/work/verif/qc/input
testbench_dir=/proj/ABC/users/nhannguyen/work/verif/qc/testbench/TT_p025c
maxi=300 # the largest number I in delay_I_J.sp.py
maxj=3 # the largest number J in delay_I_J.sp.py
i=0
until [ "$i" -gt "$maxi" ]; do
j=0
until [ "$j" -gt "$maxj" ]; do
bsub "$testbench_dir/cell/delay_${i}_${j}.sp.py" -c "$config_dir/sim.config.py" -m 1
j=$(( j + 1 ))
done
i=$(( i + 1 ))
done
スクリプトがジョブを 50 のバッチでのみ送信し、コマンドラインから送信するバッチを通知できるようにする場合。
./script 3
(バッチ3が実行されます。つまり、タスク100-149)
#!/bin/sh
batch=$1
if [ -z "$batch" ]; then
printf 'Usage: %s batchnumber\n' "$0" >&2
exit 1
fi
bstart=$(( (batch - 1)*50 ))
bend=$(( batch*50 - 1 ))
printf 'Submitting batch %d (jobs %d to %d)\n' "$batch" "$bstart" "$bend"
config_dir=/proj/ABC/users/nhannguyen/work/verif/qc/input
testbench_dir=/proj/ABC/users/nhannguyen/work/verif/qc/testbench/TT_p025c
count=0
for py in "$testbench_dir"/cell/delay_*_*.sp.py; do
if [ "$count" -gt "$bend" ]; then
break
fi
if [ "$count" -ge "$bstart" ]; then
bsub "$py" -c "$config_dir/sim.config.py" -m 1
fi
count=$(( count + 1 ))
done