簡體   English   中英

Awk / Bash編寫腳本

[英]Awk/Bash writing script

我想編寫一個將輸出awk和bash腳本的代碼。 該腳本基本上將文件切成小塊,以供程序並行運行,我想控制香料的數量,而不是像現在這樣設置一個數量。 我當前的代碼設置為使用awk將文件分成10部分,然后執行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

該答案沒有探討使用splitcsplit對文件進行分區之類的替代方法。

假設a=$(wc -l < $1) ,並且$3包含片段的數量(在本示例中為10,這是長期寫出來的),那么您可以將現有代碼打包為一個或兩個循環,使用seq生成您需要的數字:

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

那是單循環版本; 您可以先創建所有文件,然后運行第二個循環以創建所有后台進程。

我強烈懷疑您可以使用單個awk腳本來拆分文件:

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

這些代碼都沒有經過awkbash因此可能存在錯誤。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM