1

我想编写一个输出 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
4

2 回答 2

1

这个答案没有探索使用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因此其中可能存在错误。

于 2013-08-29T23:34:31.833 回答
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
于 2013-08-30T00:18:24.360 回答