2013-08-29 4 views
1

awk 및 bash 스크립트를 출력하는 코드를 작성하고 싶습니다. 이 스크립트는 기본적으로 프로그램을 병렬로 실행하기 위해 작은 파일로 파일을 잘라냅니다. 이제는 필자가하는 것처럼 설정된 번호를 사용하지 않고 peices의 수를 제어하려고합니다. 현재 코드는 awk를 사용하여 파일을 10 부분으로 잘라낸 다음 bash 스크립트를 실행하도록 설정됩니다.awk/bash 스크립트 작성

awk -v a=$a '{if (NR<(a/10)&&NR>=0) print }' $1 > $11 
awk -v a=$a '{if (NR<(a/10*2)&&NR>=(a/10*1)) print }' $1 >$12 
awk -v a=$a '{if (NR<(a/10*3)&&NR>=(a/10*2)) print }' $1 >$13 
awk -v a=$a '{if (NR<(a/10*4)&&NR>=(a/10*3)) print }' $1 >$14 
awk -v a=$a '{if (NR<(a/10*5)&&NR>=(a/10*4)) print }' $1 >$15 
awk -v a=$a '{if (NR<(a/10*6)&&NR>=(a/10*5)) print }' $1 >$16 
awk -v a=$a '{if (NR<(a/10*7)&&NR>=(a/10*6)) print }' $1 >$17 
awk -v a=$a '{if (NR<(a/10*8)&&NR>=(a/10*7)) print }' $1 >$18 
awk -v a=$a '{if (NR<(a/10*9)&&NR>=(a/10*8)) print }' $1 >$19 
awk -v a=$a '{if (NR<=(a/10*10)&&NR>=(a/10*9)) print }' $1 >$110 

bash $2 $11& 
bash $2 $12& 
bash $2 $13& 
bash $2 $14& 
bash $2 $15& 
bash $2 $16& 
bash $2 $17& 
bash $2 $18& 
bash $2 $19& 
bash $2 $110& 

나는 20을 입력 할 수 있기를 원하며이 스크립트를 20 번 쓸 것이다. 나는 내 머리 속에서이 일을하는 방법을 생각해 낼 수 없다.

도움 주셔서 감사합니다.

편집

변수에 대한 일부 자세한 내용

나는 또한 다음 코드 줄 수 루프 작성하는 방법을 잘 모르겠어요
a=`wc -l $1 | cut -f 1 -d " "` 

:

cat $11.tab $12.tab $13.tab $14.tab $15.tab $16.tab $17.tab $18.tab $19.tab $110.tab > $3 
+1

당신은 AWK 명령의 당신의 시리즈를 대체 할 수있다 (한 번만 파일을 스캔해야)하는은'split' 명령을 살펴 있어야합니다. 그런 다음'split'에 의해 생성 된 파일 집합을 반복하고 병렬 bash 명령을 실행할 수 있습니다. –

+0

'$ 110'은 아마도'$ 20'을위한 오타 일 것이며'$ {20}'이어야합니다. 모든 두 자리 위치 매개 변수는 [위치 매개 변수] (http://www.gnu.org/software/bash/manual/bash.html#Positional-Parameters) 중괄호로 묶어야합니다. '$ {1} 1','$ {1} 2' 등을 의미한다면, 중괄호를 사용하여 명확하게 만들 수 있습니다 (또는'$ 1.1' 또는 ...) 부분을 분리하기 위해 점을 사용하십시오). –

+0

'$ a'의 값은 무엇입니까? '$ 1'의 줄 수입니까? 'a = $ (wc -l <$ 1)'또는 therabouts에서와 같이? –

답변

1

이 답변은하지 않습니다를 split 또는 csplit과 같은 대안을 탐색하여 파일을 분할하십시오. 다음, 기존 코드를 가지고 당신이 필요로하는 번호를 생성하는 seq를 사용하여 하나 또는 두 개의 루프로 패키지 할 수 있습니다 (긴 형식을 작성 예 10)

가정하면 a=$(wc -l < $1)$3는 조각의 수를 포함 :

a=$(wc -l < "$1") 
n=${3:-10} 
for i in $(seq 1 $n) 
do 
    # a = number of records in file 
    # n = number of parts the file is to be split into 
    # p = part number of current part 
    awk -v a=$a -v n=$n -v p=$i '{if (NR<(a/n*p)&&NR>=(a/n*(p-1))) print }' "$1" >"$1.$i" 
    bash "$2" "$1.$i" & 
done 
wait # For all the background processes to complete 

이것은 단일 루프 버전입니다. 먼저 모든 파일을 작성한 다음 두 번째 루프를 실행하여 모든 백그라운드 프로세스를 작성할 수 있습니다. 이 코드의

a=$(wc -l < "$1") 
n=${3:-10} 
awk -v a=$a -v n=$n -v f="$1" -e \ 
    '{ nfn = int((n*NR)/a)+1; 
     if (nfn != ofn) 
     { 
      ofile = sprintf("%s.%d", f, nfn); 
      ofn = nfn; 
     } 
     print > ofile 
    }' "$1" 

for i in $(seq 1 $3) 
do 
    bash "$2" "$1.$i" & 
done 
wait # For all the background processes to complete 

없음 awk 또는 bash이 때문에 실수가있을 수 지난 없었다 :

나는 강하게 당신이 파일을 분할하는 하나의 awk 스크립트를 사용할 수 있다고 생각한다.

+0

n = 문장을 설명해 주시겠습니까? 이해가 안됩니다. – jeffpkamp

+0

'-v var = value' 표기법을 사용하여 쉘 변수를'awk' 변수를'awk' 변수로 전달할 수 있습니다.따라서 두 번째'awk' 스크립트에 3 개의 쉘 변수를 넘겼습니다 :'awk' 스크립트에서'a '라고 불리는'$ a'와'n'이라고 부르는'$ n' 그리고'$ 1' "'f라고 불리운다. 쉘 변수'$ a'에서'awk'에'lines' 변수의 이름을 지정하기 위해'-v lines = $ a'를 사용할 수있었습니다; 쉘과 awk에서 같은 이름을 사용할 의무는 없습니다 (그러나 그렇게하는 것이 종종 합리적입니다). –

+0

죄송합니다. $ = {3 : -10} 문장이 필요합니다. – jeffpkamp

1

split는 간단한 대안 다음과 같습니다

INPUT=$1 # input file 
N=$2  # number of lines per file 
SCRIPT=$3 # script to run 

mkdir chunks 
cd chunks 
split "../$INPUT" -l "$N" 
for file in *; do 
    bash "../$SCRIPT" "$file" & 
done