Awk / Bash编写脚本

时间:2013-08-29 22:12:29

标签: bash awk self

我想编写一个输出awk和bash脚本的代码。这个脚本基本上将文件切成小块,以便程序并行运行,我想控制peices的数量,而不是像我现在那样设置一个数量。我当前的代码设置为使用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

2 个答案:

答案 0 :(得分:1)

此答案不会探讨使用splitcsplit对文件进行分区等替代方法。

假设a=$(wc -l < $1),并且$3包含片段数(示例中写出的10个片段),那么您可以使用{现有代码并将其打包为一个或两个循环使用{ {1}}生成您需要的数字:

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,因此可能会出现错误。

答案 1 :(得分: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