2017-04-30 7 views
0

私は、10〜100行の長さのtxtファイルを持っており、前のフィールドが一致するならば、各行(および出力)を特定する必要があります。ここAWK - 一致後の特定のフィールドの合計

は、例えばDATSETある:

Sample4;6a0f64d2;size=1;,Sample4;f1cb4733a;size=6;,Sample3;aa44410feb29210c1156;size=2; 
Sample2;5b91bef2329bd87f4c7;size=2;,Sample1;909cd4e2940f328b3;size=2; 

構造は

<sample ID>;<random id>;size=<numeric>;,次いで、次のエントリです。

基本的に、私は行の各エントリの「サイズ」の数を( '、'で区切られたエントリ)合計したいが、我々はちょうど一致させたい場合は、 『Sample4まで追加だから、
(例えば例えばsample4)特定のサンプル識別子との一致を持って、「Sample4のを持つエントリがあるので、スクリプトはthis-

awk '{some-code for sample4}' example.txt 
7 
0 

を生成します』行1では7に、行2では一致するSample4エントリはありません。

これは、「SampleID」ごとに実行できます。理想的には、リストに含まれるすべてのサンプルID(1つのサンプルIDあたり1行のシンプルファイル)で実行できます。各サンプルIDには独自の列があります。上記の例のファイルの場合、スクリプトの結果は次のようになります:

Sample1 Sample2 Sample3 Sample4 
0  0  2  7 
2  2  0  0 

どのようにすればよいですか?

ありがとうございます!

+0

「行内に何百ものエントリがある」場合、 '\ n'の論理関数は何ですか?別々の行は何かを意味しますか? – dawg

+0

各系統は異なるタクソンまたは生物に対応する。したがって、このスクリプトの目的は、各行(分類群)のサンプルIDの出現を合計/カウントすることです。 –

答えて

2

awk

awk -F';' '{for(i=1;i<NF-1;i+=3) 
       {split($(i+2),e,"="); 
       sub(/,/,"",$i); 
       header[$i]; 
       a[$i,NR]+=e[2]}} 
     END {for(h in header) printf "%s", h OFS; 
      print ""; 
      for(i=1;i<=NR;i++) 
       {for(h in header) printf "%s", a[h,i]+0 OFS; 
       print ""}}' file | column -t 


Sample1 Sample2 Sample3 Sample4 
0  0  2  7 
2  2  0  0 

PSを。列の順序は保証されません。私は区切り文字として;を使用し、名前の前に,を処分した構文解析を簡素化するために

説明 。代入配列=マルチダミー配列aを使用する各行の値の合計の割り当てを使用して、ヘッダ配列のすべての名前を個別に追跡します。行が消費されたら、ENDブロックでヘッダーを印刷し、行ごとに対応する名前の値を表示します(行方不明の場合は0)。 column -tでかなり印刷します。

+1

ニース........... – dawg

+0

すごく簡単な説明を教えてください。そこに行くの? –

0

私はこれを正しく理解していた場合、あなたが行うことができます:

$ awk '{split($0,samp,/,/) 
     for (i=1; i in samp; i++){ 
     sub(/;$/, "", samp[i]) 
     split(samp[i], fields, /;/) 
     split(fields[3], ns, /=/) 
     data[fields[1]]+=ns[2] 
    } 
     printf "For line %s:\n", NR 
     for (e in data) 
      print e, data[e] 
     split("", data) 
}' file 

プリント:

For line 1: 
Sample3 2 
Sample4 7 
For line 2: 
Sample1 2 
Sample2 2 
関連する問題