Desmembrando um arquivo grande em múltiplos?

0

Eu tenho um arquivo grande run_simulation.csh de cerca de 1000 linhas

#!/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
...............

Eu gostaria de dividir este arquivo em um pequeno arquivo de 50 linhas e elas devem ter as 3 primeiras linhas do arquivo grande run_simulation.csh. Se possível, esse pequeno arquivo tem extensão .csh. Como faço isso? por comando?

#!/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
    
por Trong Nhan Nguyen 20.06.2018 / 05:17

3 respostas

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
    
por 20.06.2018 / 14:35
0

Um exemplo simples, testado com 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
    
por 20.06.2018 / 13:50
0

Supondo que você queira bsub de cada script que corresponda ao padrão "$testbench_dir"/cell/delay_*_*.sp.py , você poderá substituir seu script pelo seguinte:

#!/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

Este é um script /bin/sh , não um script csh , mas isso não deve importar.

Se você precisar garantir que os scripts sejam executados em uma ordem específica (o acima classificaria os arquivos de script em ordem lexicográfica), faça um loop duplo:

#!/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

Se você quiser que o script envie apenas trabalhos em lotes de 50 e que seja capaz de informá-lo na linha de comando sobre o lote a ser enviado, por exemplo,

./script 3

(executaria o lote 3, ou seja, trabalhos 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
    
por 20.06.2018 / 14:07