首页 > 解决方案 > 使用 bash 创建一个 2D 零矩阵的 CSV 文件,或者在 bash 中不可能的最小的 python 位

问题描述

这是针对数值数据科学应用程序的。我需要在一个文件中创建一个零矩阵,用逗号分隔(在一行内)并以换行符结尾(在每行的末尾)。这个 bash 代码是最接近的:

l=`python -c "print(f'{\"0, \" * 9}0')"`  # 10 zeros comma separated in one line
yes $l | head -n 3  # print line 3 times
0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 0, 0, 0, 0, 0, 0

就目前而言,这很好,直到您尝试将两个文字 9 和 3 更改为 shell 变量。但是,(对我而言)很难正确编码以将文字 9 替换为 shell 变量 n=9。我尝试使用 bash 和 python 但仍然无法正常工作。例如,这两种不同的尝试实际上不适用于(对我而言)变量:

l=$(printf '0,%.0s' {1..$((n-1))}; printf '0')  # 100% bash code
yes $l | head -n $k  # print line 3 times
0,0
0,0
0,0

l=`python -c "print(f'{\"0, \" * 9}0')"`  # using a bit of python, 10 literal zeros comma separated in one line
yes $l | head -n 3  # print line 3 times
0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 0, 0, 0, 0, 0, 0

在这种情况下,在 python 中将文字 9 更改为变量更糟糕,并且给了我一些疯狂的东西,比如某种我绝对不想要的目录列表。

标签: pythonbashdata-science

解决方案


只是您的方法略有不同:

n=10
k=3
yes "$(yes 0 | head -n "$n" | paste -s -d,)" | head -n "$k"

如果需要逗号后的空格,则可以使用管道来sed 's/,/, /g'执行此操作。


推荐阅读