我使用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 :(得分: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