如何在 shell 中创建具有零值的列?

如何在 shell 中创建具有零值的列?

如何创建一个只有一列、其中有 1000 行为零值的数据文件?

就像是:

output:

0
0
0
0
0
.
.

答案1

你可能会使用是(1)为此(通过管道输送到头(1)...):

yes 0 | head -n 1000 > data_file_with_a_thousand_0s.txt

如果您需要一百万个零,请将其替换10001000000

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

答案2

简单地,

printf '0\n%.0s' {1..1000}

或使用for循环,

for i in {1..1000}; do echo "0"; done

使用awk

awk 'BEGIN{for(c=0;c<1000;c++) print "0"}'

正如 @StéphaneChazelas 指出的,使用{1..1000}需要zsh或最新版本的bash,yashksh93也意味着将整个范围存储在内存中(可能多次)。您会发现它比使用awkyes 0 | head ...等大范围要慢得多(如果它不会因 OOM 而崩溃){1..10000000}。或者换句话说,它的扩展性不好。可能的解决方法是使用

for ((i=0; i<=10000000;i++)); do echo 0; done 

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

答案3

perl -e 'print "0\n" x 1000' > file.txt


正如 @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

答案4

seq可用于:

seq 0 0 0 | head -1000

相关内容