首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >加快文本处理

加快文本处理
EN

Unix & Linux用户
提问于 2018-05-07 13:30:22
回答 1查看 1.1K关注 0票数 4

我有下面的脚本来处理带有一些数据的文件:首先,头被打印到输出文件中。然后随机选择输入中的60000行,并将其打印到输出(多次打印同一行的可能性是显式所需)。

代码语言:javascript
复制
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

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

谢谢您抽时间见我!

EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2018-05-07 13:39:15

首先要从名为input的文件中提取36个行头,然后从文件的其余部分中选择60000条随机行,并且有可能多次随机选择同一行。所有输出都应该转到名为output的文件中。

使用GNU中的shuf

代码语言:javascript
复制
#!/bin/sh

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

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

另一种选择是:

代码语言:javascript
复制
( head -n 36 output

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

代码语言:javascript
复制
( head -n 36; shuf -r -n 60000 ) output
票数 14
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/442315

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档