![加快文本处理速度](https://linux22.com/image/132929/%E5%8A%A0%E5%BF%AB%E6%96%87%E6%9C%AC%E5%A4%84%E7%90%86%E9%80%9F%E5%BA%A6.png)
我有以下脚本来处理包含一些数据的文件:首先,将标题打印到输出文件。然后从输入中随机选取 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
.
使用shuf
GNU 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