加快文本处理速度

加快文本处理速度

我有以下脚本来处理包含一些数据的文件:首先,将标题打印到输出文件。然后从输入中随机选取 60000 行并打印到输出(多次打印同一行的可能性是明确地通缉)。

N = 60000
gawk '{if (NR < 37) print $0}' input > output
MAX=$(gawk 'END{print NR}' input)

for ((i=1; i<=$N; i++ ))
do

   declare $(gawk -v min=37 -v max=$MAX -v seed=$RANDOM 'BEGIN{srand(seed); print "x="int(min+rand()*(max-min+1))}')
   gawk -v l=$x 'NR>36 && NR==l {print $0}' input >> output

done

我现在认为这是非常低效的,所以我对如何提高这段代码的性能持开放态度,也许有可能阻止一直打开和关闭输入文件?

感谢您的时间!

答案1

您想要首先从名为 的文件中提取 36 行标题input,然后从文件的其余部分中随机选取 60000 行,并且可以多次随机选取同一行。所有输出都应转到名为output.

使用shufGNU coreutils:

#!/bin/sh

# Fetch header (36 first lines)
head -n 36 <input >output

# Scramble the other lines and pick 60000 (allowing for repeated lines)
tail -n +37 <input | shuf -r -n 60000 >>output

或者:

( head -n 36 <input; tail -n +37 <input | shuf -r -n 60000 ) >output

使用 GNU head,它将输入文件流保留在最后一行输出之后的位置,这意味着shuf可以在head完成读取的位置继续(这可能不适用于一些非 GNUhead实现):

( head -n 36; shuf -r -n 60000 ) <input >output

相关内容