2015-05-02 80 views

回答

2

考慮這種樣品基體:

$ 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 
+1

爲什麼不使用三元用於第二'%S (也就是說,我認爲這是一個非常重要的問題):{{for(i = 1; i <= NF; i ++)printf「%s%s」,(i

1

這可能爲你工作(GNU SED):

sed -r ':a;n;H;G;s/\n//;:b;s/^\S+\s*(.*)\n.*/\1/;tb;$!ba' file 

將保留空間用作已處理線條的計數器,並且對於每條當前線條將當前線條前面的許多字段刪除。

N.B.計數器在打印當前行後設置,否則第一行將減去第一個字段。

在反射的替代/更好的解決方案是:

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 
0
$ awk '{for (i=NR;i<=NF;i++) printf "%s%s",$i,(i<NF?FS:RS)}' file 
1 2 3 
5 6 
9