2015-05-04 176 views
-1

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

您忘記了打印'empty'元素打印之前添加'; else if(i NeronLeVelu

回答

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 
+0

Jotne,我們如何通過sed命令來做到這一點 – abinasunny

+0

@abinasunny'sed'更多的是單線工具。這可能是一個解決方案,但爲什麼不堅持使用'awk'。據我所見,如果你有'sed',你也有'awk' – Jotne

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 
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 

...產生了這個O utFile ...

1 
2 
    3 
    4 

如果你想最大限度地減少擊鍵該作品一樣好......

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

丹尼爾B.馬丁

0

一些快捷方式(我把一個輸出字符串(%s)更加詳盡,但(%d)足以用於$ i打印且不需要更換每個元素的內容

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