대용량 파일을 여러 개로 분할하시겠습니까?

대용량 파일을 여러 개로 분할하시겠습니까?

약 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

관련 정보