我有一系列非常大的空格分隔值的单行文件。它看起来像
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个字符,即使这对应于未定义的数值。
答案 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字节文本文件花费的时间长。