如何在shell中创建一个值为零的列?

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)

如果你需要一百万零,更换10001000000

附注。过去,head -1000相当于head -n 1000今天就够了。


Rah*_*hul 8

简单地,

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, yashorksh93也意味着将整个范围存储在内存中(可能多次)。你会发现它变得比使用awkyes 0 | head ...大范围(如{1..10000000}. 或者换句话说,它不能很好地扩展。可能的解决方法是使用

for ((i=0; i<=10000000;i++)); do echo 0; done 
Run Code Online (Sandbox Code Playgroud)

ksh93/ zsh/ bash)不会有内存问题,但仍然是数量级比专用工具或真正的编程语言的方法要慢。


Sun*_*eep 6

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)