打印对角线的矩阵
我用AWK命令打印对角线打印对角线的矩阵
awk '{ for (i=1; i<=NF; i++) if (NR >= 1 && NR == i) print $(i - 0) }' matrix
和输出是像:
1
2
3
4
怎么能显示这样的:
1
2
3
4
矩阵:
1 0 3 5
0 2 6 7
3 0 3 5
8 7 2 4
这可能会做:
awk '{for (i=1;i<=NF;i++) if (NR>=1 && NR==i) {for (j=1;j<=i-1;j++) printf " ";print $(i-0)}}' matrix
1
2
3
4
只添加行前面i-1
数量的空间。
或者您可以使用计数器来确保其独立于行号和选项卡。
awk '{for (i=1;i<=NF;i++) if (NR>=1 && NR==i) {c++;for (j=1;j<=c-1;j++) printf "\t";print $(i-0)}}' matrix
1
2
3
4
Jotne,我们如何通过sed命令来做到这一点 – abinasunny
@abinasunny'sed'更多的是单线工具。这可能是一个解决方案,但为什么不坚持使用'awk'。据我所见,如果你有'sed',你也有'awk' – Jotne
这可能为你工作(GNU SED):
sed -r '1!G;h;:a;s/^(\s*)\S+\s*(.*)\n.*/ \1\2/;ta;s/^(\s*\S+).*/\1/' file
它使用保留空间来计算行数,因此该领域的矩阵中的位置。
单个空间用于替换在显示的字段前移除的字段,以及在显示的字段被移除后到达的字段。
要使用标签使用替换空格分隔符:
sed -r '1!G;h;:a;s/^(\s*)\S+\s*(.*)\n.*/\t\1\2/;ta;s/^(\s*\S+).*/\1/' file
有了这个INFILE ...
1 0 3 5
0 2 6 7
3 0 3 5
8 7 2 4
...这AWK ...
awk '{for (j=1;j<=NF;j++) if (j!=NR) $j=""; print}' $InFile >$OutFile
...产生了这个O utFile ...
1
2
3
4
如果你想最大限度地减少击键该作品一样好......
awk '{for (j=1;j<=NF;j++) j!=NR?$j="":1}1' $InFile >$OutFile
丹尼尔B.马丁
一些快捷方式(我把一个输出字符串(%s)更加详尽,但(%d)足以用于$ i打印且不需要更换每个元素的内容
awk '{ printf("%" (i++ * 2) "s%s\n", "", $i)}' YourFile
您忘记了打印'empty'元素打印之前添加'; else if(i
NeronLeVelu