你将如何输出文件的对角线?
例如,我得到了一个包含以下内容的文件。
1,2,3,4,5
6,7,8,9,0
1,2,3,4,5
6,7,8,9,0
1,2,3,4,5
Run Code Online (Sandbox Code Playgroud)
输出应该看起来像:1 7 3 9 5
或类似的东西。
我可以通过 cut (cut -d "," -f5 文件名) 输出一列,但我不确定要写什么才能只输出对角线。
awk 解决方案,不像@don_chrissti 解决方案那么优雅,但适用于非正方形的地方。
awk -F, '{a=a$++n" "}END{print a}' file
Run Code Online (Sandbox Code Playgroud)
我们正在查看的输入数据可以被视为矩阵或二维数组。现在,如果我们从这个角度来看问题,有几种计算工具可用于处理矩阵。特别是,Python 的numpy
模块允许这样做。因此,我们可以使用两件事 -loadtxt()
函数和diagonal()
提取所需的数据:
$ python -c 'import sys,numpy;a=numpy.loadtxt(sys.argv[1],dtype=int,delimiter=",");print( a.diagonal() )' input.txt
[1 7 3 9 5]
Run Code Online (Sandbox Code Playgroud)
现在,这是完成的大部分工作。为了使输出更漂亮,我们只需要将获得的数据转换为字符串,并从单个字符串中创建一个以空格分隔的字符串。像这样:
$ python -c 'import sys,numpy;a=numpy.loadtxt(sys.argv[1],delimiter=",");print(" ".join( [ str(int(i)) for i in a.diagonal() ]))' input.txt
1 7 3 9 5
Run Code Online (Sandbox Code Playgroud)
当然,所有这些都不必一次性完成。为了可读性,我们可以制作一个小脚本,它也将允许我们处理在命令行中作为参数给出的所有文件名:
$ python -c 'import sys,numpy;a=numpy.loadtxt(sys.argv[1],dtype=int,delimiter=",");print( a.diagonal() )' input.txt
[1 7 3 9 5]
Run Code Online (Sandbox Code Playgroud)