【问题标题】:how can i print the upper triangle of a matrix如何打印矩阵的上三角形
【发布时间】:2015-05-02 06:39:56
【问题描述】:

使用 awk 命令我尝试打印矩阵的上三角形

awk '{for (i=1;i<=NF;i++) if (i>=NR) printf  $i FS "\n"}' matrix

但输出显示为单行

【问题讨论】:

    标签: linux shell loops awk sed


    【解决方案1】:

    考虑这个示例矩阵:

    $ 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&lt;=NF;i++) printf "%s%s",(i&lt;NR?FS:$i),(i&lt;NF?FS:RS)} - 我还移动了括号,因为我想我记得这样可以更广泛地兼容。
    【解决方案2】:

    这可能对你有用(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
    

    【讨论】:

      【解决方案3】:
      $ awk '{for (i=NR;i<=NF;i++) printf "%s%s",$i,(i<NF?FS:RS)}' file
      1 2 3
      5 6
      9
      

      【讨论】:

        猜你喜欢
        • 2020-10-05
        • 1970-01-01
        • 1970-01-01
        • 2011-06-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-02
        相关资源
        最近更新 更多