【发布时间】:2015-05-02 06:39:56
【问题描述】:
使用 awk 命令我尝试打印矩阵的上三角形
awk '{for (i=1;i<=NF;i++) if (i>=NR) printf $i FS "\n"}' matrix
但输出显示为单行
【问题讨论】:
使用 awk 命令我尝试打印矩阵的上三角形
awk '{for (i=1;i<=NF;i++) if (i>=NR) printf $i FS "\n"}' matrix
但输出显示为单行
【问题讨论】:
考虑这个示例矩阵:
$ cat matrix
1 2 3
4 5 6
7 8 9
打印右上角的三角形:
$ awk '{for (i=1;i<=NF;i++) printf "%s%s",(i>=NR)?$i:" ",FS; print""}' matrix
1 2 3
5 6
9
或者:
$ awk '{for (i=1;i<=NF;i++) printf "%2s",(i>=NR)?$i:" "; print""}' matrix
1 2 3
5 6
9
打印左上角三角形:
$ awk '{for (i=1;i<=NF+1-NR;i++) printf "%s%s",$i,FS; print""}' matrix
1 2 3
4 5
7
或者:
$ awk '{for (i=1;i<=NF+1-NR;i++) printf "%2s",$i; print""}' matrix
1 2 3
4 5
7
【讨论】:
%s 中使用三元组:{for (i=1;i<=NF;i++) printf "%s%s",(i<NR?FS:$i),(i<NF?FS:RS)} - 我还移动了括号,因为我想我记得这样可以更广泛地兼容。
这可能对你有用(GNU sed):
sed -r ':a;n;H;G;s/\n//;:b;s/^\S+\s*(.*)\n.*/\1/;tb;$!ba' file
将保留空间用作已处理行的计数器,并为每个当前行删除当前行前面的许多字段。
注意计数器在打印当前行之后设置,否则第一行将减去第一个字段。
经过反思,另一种/更优雅的解决方案是:
sed -r '1!G;h;:a;s/^\S+\s*(.*)\n.*/\1/;ta' file
并打印左上角三角形:
sed -r '1!G;h;:a;s/^([^\n]*)\S+[^\n]*(.*)\n.*/\1\2/;ta' file
【讨论】:
$ awk '{for (i=NR;i<=NF;i++) printf "%s%s",$i,(i<NF?FS:RS)}' file
1 2 3
5 6
9
【讨论】: