2011-10-26 23 views
2

我有我設法與周圍的工作來解決,所以我在這裏希望從學習問題,你更優雅的解決方案;-)從XYZ使用awk,以矩陣

我必須解析程序的輸出:它寫入三列的文件XYZ這樣

1 1 11 
1 2 12 
1 3 13 
1 4 14 
2 1 21 
2 2 22 
2 3 23 
2 4 24 
3 1 31 
3 2 32 
3 3 33 
3 4 34 
4 1 41 
4 2 42 
4 3 43 
4 4 44 

在矩陣這樣

11 12 13 14 
21 22 23 24 
31 32 33 34 
41 42 43 44 

我喜歡這個

兩線bash腳本解決
dim_matrix=$(awk 'END{print sqrt(NR)}' file_xyz) #since I know that the matrix has to be squared and there are no blank lines in the file_xyz 
awk '{printf("%s%s",$3, !(NR%'${dim_matrix}'==0) ? OFS :ORS) }' file_xyz 

你能給我推薦一種只用awk執行相同的方法嗎?

回答

1

AWK不會做真正的多維數組,但你可以用正確構造字符串假貨:

awk ' 
    {mx[$1 "," $2] = $3} 
    END { 
    size=sqrt(NR) 
    for (x=1; x<=size; x++) { 
     for (y=1; y<=size; y++) 
      printf("%s ",mx[x "," y]) 
     print "" 
    } 
    } 
' filename 

您可以使用單個awk調用並致電wc

awk -v "nlines=$(wc -l < filename)" ' 
    BEGIN {size = sqrt(nlines)} 
    {printf("%s%s", $3, (NR % size == 0 ? ORS : OFS)) 
}' filename 
+0

非常感謝您!這真的幫助了我! – Mareczek

+0

可能我發現了一個較短的腳本... AWK' {ARR [C++] = $ 3} END { 大小= SQRT(NR) 爲(C = 0;ç Mareczek

+1

關於awk的關鍵是腳本的佈局:'condition {body} condition {body}。只有當給定的條件爲真時,身體纔會執行。空白狀態意味着每一行都會執行正文。一個空白體隱含地是'{print $ 0}'。 –

1

我不能完全確定你試圖做什麼,試試這個:

awk 'NR%4==0{print s " " $NF;s="";next}{s=s?s " " $NF:$NF}' file1 
+0

命令dint在Solaris的awk中工作...它與nawk想法一起工作得非常漂亮...... – tomkaith13

+0

@Chris我不想寫入file_xyz的行數explisicitly我想awk會這樣做,將此號碼存儲在內存中,並使用它格式化矩陣文件...對於不好的解釋抱歉;-)謝謝 – Mareczek

1

A「不那麼」閱讀的版本:

awk '($0=$NF x)&&ORS=NR%4?FS:RS' infile 

參數添加爲每個操作的要求:

awk ' 
    ($0 = $NF x) && ORS = NR % n ? FS : RS 
    ' n="$1" infile 

在上面的腳本我使用$ 1,但你可以使用任何變量。

的解釋如下:

$0 = $NF - 設置$ 0(整個當前輸入記錄) 到最後一個字段($ NF)的當前值。

ORS = NR % n ? FS : RS - 使用三元運算符:

expression ? return_this_if_true : return_this_otherwise

設置OutputRecordSeparator到:

  • 當NR%正判斷爲真(即返回值不大於0) 組ORS到FS的當前值(FieldSeparator - 缺省運行空白 字符)

  • 否則設置爲RS(默認爲一個新行)

的X(一個未初始化變量,因此在串聯使用時NULL字符串) 是需要的,以便正確地處理輸出 時最後一個字段是0(或一個空字符串)。 這是因爲awk 中的assignement語句實際上在此情況下返回分配的值 如果$ NF爲0,則將忽略其餘的& &布爾語句 。

+0

太棒了!你是否也可以讓腳本完成所有工作,以便我不必明確寫出NR%4? 如果你能向我解釋這條awk如何工作,我將非常感激。非常感謝你! – Mareczek

+1

@Mariano,參數和評論添加。 –

+0

非常感謝Dimitre,我非常感謝你的回答 – Mareczek