2017-08-13 28 views
0

我有這個txt文件,其中包含某些音頻文件的某些部分的概率。將行連接到文本文件中的列表

實施例:

K-0_0_1_0_1_0_1_1_8547 [ 
    0 0 1 ] 
K-0_0_1_0_1_0_1_1_23086 [ 
    1 1.191074e-27 1.574905e-26 ] 
K-0_0_1_0_1_0_1_1_23781 [ 
    0 0 1 ] 
K-0_0_1_0_1_0_1_1_3732 [ 
    0 0 1 ] 
K-0_0_1_0_1_0_1_1_13964 [ 
    0 0 1 ] 
K-0_0_1_0_1_0_1_1_3098 [ 
    1 0 0 ] 
K-0_0_1_0_1_0_1_1_8296 [ 
    0 0 1 ] 
K-0_0_1_0_1_0_1_1_1780 [ 
    0 0 1 ] 
K-0_0_1_0_1_0_1_1_21968 [ 
    1 1.377321e-38 0 ] 

在其中期望的輸出應是

K-0_0_1_0_1_0_1_1 [ 
0 0 1 
1 0 0 
0 0 1 
0 0 1 
0 0 1 
0 0 1 
1 1.377321e-38 0 
1 1.191074e-27 1.574905e-26 
0 0 1 ] 

輸入文件的結構類似於本

filename_pieces [ probability_1 probability_2 probability_3 ] 

我想收集的所有部分文件名在一個 的概率組合列表中,其中位置按升序排列。

所以在向上的情況下,應該合併名單中,像這樣

_1780 
_3098 
_3732 
and so on.. 

我已經正在這樣做的方法是使用這個腳本結構..

awk 'NF == 2{ match($1,/^[0-9]+(_[0-9]+){7}/); k = substr($1,RSTART,RLENGTH); next } 
    { $NF=""; a[k]=a[k]"\n "$0 } 
    END { for(i in a) printf "%s [%s ]\n\n",i,a[i] }' 

但這似乎並不喜歡文件名前面的K-,這很關鍵。有些時候我可以改變腳本來處理這個問題。前面的有效文件名只是0_0_1_0_1_0_1_1,所以沒有K-的號碼。

+0

那麼,什麼是您的有效文件名?我看到你要求他們有8個數字用下劃線分開。什麼是有效的前綴(沿着'K-')? – randomir

+0

@randomir我剛剛添加了它。但有效的文件名是相同的名稱沒有'K-'所以只是'0_0_1_0_1_0_1_1' – Lamda

回答

1

根據你的腳本,但用文件的一部分(用下劃線分隔的最後一個數字)加入排序和按文件名相結合,腳本看起來像這樣(擴展到多的可讀性):

#!/usr/bin/awk -f 

NF == 2 { 
    match($1, /_[0-9]+$/) 
    filename = substr($1, 0, RSTART-1) 
    part = substr($1, RSTART+1, RLENGTH) 
    next 
} 

{ 
    $NF = "" 
    all[filename][part] = $0 
} 

END { 
    for (filename in all) { 
     n = asorti(all[filename], sorted, "@ind_num_asc") 
     printf "%s [", filename 
     for (i=1; i<=n; i++) { 
      printf "\n%s", all[filename][sorted[i]] 
     } 
     print "]" 
    } 
} 

首先,我們將所有零件存儲在二維數組中,按文件名和零件號進行組織。最後,對於遇到的每個文件,我們按升序索引(它們是部件號)進行排序,然後按順序打印文件的所有部分。

運行它在你的樣品輸入,我們得到:

$ awk -f join.awk audio 
K-0_0_1_0_1_0_1_1 [ 
0 0 1 
1 0 0 
0 0 1 
0 0 1 
0 0 1 
0 0 1 
1 1.377321e-38 0 
1 1.191074e-27 1.574905e-26 
0 0 1 ] 
+0

它應該雖然應該是另一種方式...它看起來像結果是升序而不是降序連接.. – Lamda

+0

哦,所以你想按升序編號排序嗎?另外,您的輸入文本是否包含多個文件,或者始終是一個文件? – randomir

+0

它包含多個文件...其中一些以'g-'開頭而不是'K-' – Lamda

相關問題