打印对角线的矩阵

问题描述:

我用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 
+0

您忘记了打印'empty'元素打印之前添加'; else if(i NeronLeVelu

这可能会做:

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 
+0

Jotne,我们如何通过sed命令来做到这一点 – abinasunny

+0

@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