zar*_*ara 5 shell text-processing
如何创建一列数据文件,其中将有 1000 行零值?
就像是:
output:
0
0
0
0
0
.
.
Run Code Online (Sandbox Code Playgroud)
.
Bas*_*tch 11
您可以为此使用yes(1)(通过管道输入head(1) ...):
yes 0 | head -n 1000 > data_file_with_a_thousand_0s.txt
Run Code Online (Sandbox Code Playgroud)
如果你需要一百万零,更换1000
用1000000
附注。过去,head -1000
相当于head -n 1000
今天就够了。
简单地,
printf '0\n%.0s' {1..1000}
Run Code Online (Sandbox Code Playgroud)
或使用for
循环,
for i in {1..1000}; do echo "0"; done
Run Code Online (Sandbox Code Playgroud)
使用awk
,
awk 'BEGIN{for(c=0;c<1000;c++) print "0"}'
Run Code Online (Sandbox Code Playgroud)
正如@StéphaneChazelas 指出的那样,使用{1..1000}
需要zsh
或最新版本的bash
, yash
orksh93
也意味着将整个范围存储在内存中(可能多次)。你会发现它变得比使用awk
或yes 0 | head ...
大范围(如{1..10000000}
. 或者换句话说,它不能很好地扩展。可能的解决方法是使用
for ((i=0; i<=10000000;i++)); do echo 0; done
Run Code Online (Sandbox Code Playgroud)
(ksh93
/ zsh
/ bash
)不会有内存问题,但仍然是数量级比专用工具或真正的编程语言的方法要慢。
perl -e 'print "0\n" x 1000' > file.txt
Run Code Online (Sandbox Code Playgroud)
正如@Stéphane Chazelas 所指出的,这对于大量数据来说很快,但可能会遇到内存问题(yes|head
在这种情况下使用方法)
性能比较,从 3 次连续运行中选出最好的
$ time perl -e 'print "0\n" x 100000000' > /dev/null
real 0m0.117s
$ time python -c 'import sys; sys.stdout.write("0\n" * 100000000)' > /dev/null
real 0m0.184s
$ time yes 0 | head -n 100000000 > /dev/null
real 0m0.979s
$ time awk 'BEGIN{for(c=0;c<100000000;c++) print "0"}' > /dev/null
real 0m12.933s
$ time seq 0 0 0 | head -n 100000000 > /dev/null
real 0m19.040s
Run Code Online (Sandbox Code Playgroud)