我想编写一个输出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
答案 0 :(得分:1)
此答案不会探讨使用split
或csplit
对文件进行分区等替代方法。
假设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