[英]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
該答案沒有探討使用split
或csplit
對文件進行分區之類的替代方法。
假設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
這些代碼都沒有經過awk
或bash
因此可能存在錯誤。
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.