2017-08-13 4 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 ] 

ように構成されなければなりませんファイル名は1つの の組み合わせリストで、位置は昇順です。だから、場合アップに組み合わせリストが

このような
_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 "]" 
    } 
} 

まず、すべてのパーツを2次元配列に格納し、ファイル名とパーツ番号で整理します。最終的に、遭遇した各ファイルについて、昇順(部品番号である)でインデックスをソートし、ファイルのすべての部品を順番に印刷します。あなたのサンプル入力でそれを実行している

、我々が得る:

$ 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

ああ、そうです昇順のセクションIDで注文しますか?また、入力テキストには複数のファイルが含まれていますか、または常に1つですか? – randomir

+0

それは複数のファイルを含んでいます...そして、それらのうちのいくつかは 'K-'の代わりに 'g-'で始まります。 – Lamda

関連する問題