bash:首先阅读' n'文件中的条目

时间:2017-04-12 17:15:10

标签: bash performance file

我有一系列非常大的空格分隔值的单行文件。它看起来像

0.993194 0.9684194 0.846847658 1.0 1.0 1.0 1.0 0.78499 0.54879564 0.9998545 ...

我想读取每个文件的前n个元素的第一个副本。

我可以将空格转换为新行(cat file.txt | tr ' ' '\n' > file2.txt),然后逐行读取并将每行保存在新文件(head -n $n file2.txt | while read line; do echo $line >> file3.txt;done)中,但这样会很慢。 (以上代码未经测试)

如何有效复制单行文件的前n个值?

注意:我可以复制前n个字符,即使这对应于未定义的数值。

2 个答案:

答案 0 :(得分:2)

如何使用awk指定所需的记录数?

awk -v n=5 '{for(i=1;i<=n;i++) print $i}' file
0.993194
0.9684194
0.846847658
1.0
1.0

(或)使用printf

在同一行打印
awk -v n=5 '{for(i=1;i<=n;i++) printf "%s ",$i}' file
0.993194 0.9684194 0.846847658 1.0 1.0

(或)使用cut符合POSIX的选项,-d用于设置去限制器,-f 1-5用于字段1到5。

cut -d' ' -f 1-5 file
0.993194 0.9684194 0.846847658 1.0 1.0

答案 1 :(得分:1)

我在egrep中使用精心设计的正则表达式,并使用-o标记使其仅打印匹配的输出:

egrep -e '^([0-9.]+[ ]*){3}' -o file.txt

打印出来:

0.993194 0.9684194 0.846847658

由于grep是一个非常着名且经过大量优化的工具,因此效果非常好;我只是在一个3兆字节的文本文件上尝试过,并且它花费的时间并不比30字节文本文件花费的时间长。