打印矩阵的对角线

时间:2015-05-04 05:31:48

标签: linux shell awk sed

我使用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

4 个答案:

答案 0 :(得分:0)

这可能会:

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

答案 1 :(得分:0)

这可能适合你(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

答案 2 :(得分:0)

有了这个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

...制作了这个OutFile ......

1   
 2  
  3 
   4

如果您希望尽量减少按键操作,那么这也很有效......

awk '{for (j=1;j<=NF;j++) j!=NR?$j="":1}1' $InFile >$OutFile

Daniel B. Martin

答案 3 :(得分:0)

有一些快捷方式(我把输出作为字符串(%s)更加充实但是(%d)足以用于$ i打印并且不替换每个元素的内容

awk '{ printf( "%" ( i++ * 2 ) "s%s\n", "", $i)}' YourFile