2016-05-09 1 views
1

私は1212 .csvのファイルにフェッチされた分類名とその頻度(各名前がフェッチされた回数)を含んでいます。私はマスターファイル.txtを作成して、少なくとも12個のファイルにわたって1回以上見つかったすべての固有の分類群をリストアップしました。 csv形式の連結テーブルを作成する必要があります。ここで、行のヘッダーは各ファイルの名前であり、列のヘッダーはすべてマスター.txtファイルにリストされている固有の分類です。各.csv入力ファイルには、各分類群の横にある頻度で表を作成する必要があります。マスターリストには12のファイルで可能なすべての分類が含まれていますが、すべての分類にすべての分類が含まれているわけではありません。分類群が見つからないときは、「0」を配置する必要があります。複数のCSVファイルに含まれる分類群の頻度からテーブルを作成

.csv入力:

$cat file_1 

1,Salmo salar 
12,Solanum pennellii 
18,Staphylococcus xylosus 
... 

$cat file_2 

1,Salmo salar 
14,Staphylococcus xylosus 
123,Strongyloides stercoralis 
... 

$cat file_3 

123,Solanum pennellii 
11,Staphylococcus xylosus 
41,Strongyloides stercoralis 
... 

.txtマスターリスト:

$cat master 

Salmo salar 
Solanum pennellii 
Staphylococcus xylosus 
Strongyloides stercoralis 
... 

.csv出力(Iは必要なもの):

Sample,Salmo salar,Solanum pennellii,Staphylococcus xylosus,Strongyloides stercoralis 
File_1,1,12,18,0  
File_2,1,0,14,123  
File_3,0,123,11,41 

は、私が以前にせずに、小さなPythonスクリプトを作ってみましたマスターリストとを使用して頻度の代わりにtaxaという名前の繰り返しを含む3210入力ファイル。私は各ファイルの分類が見当たらない表を手に入れることができなかったので、マスターリストを作成して入力ファイルを折りたたむことにしました。私は非常にPythonで新しいので、任意の助けに感謝されます。

+0

私の代わりに周波数を有するの(マスターリストを使用したり、CSV入力ファイルを崩すことなく、スクリプトを作ってみました、ファイルは同じ名前が何度も​​繰り返されています)、私が望んだとおりに動作しませんでした。 –

答えて

0

awkについては、お礼を申し上げます。

awkが作成されました。

これに試してみて:

awk -F "," -v OFS="," ' 
FNR==1 {samples[++fni]=FILENAME} 
{if (!taxakeys[$2]) {taxakeys[$2]=1; taxas[++ti]=$2};frequencies[samples[fni],$2]+=$1} 
END { 
    printf("Sample"); for (j=1;j<=ti;j++) { printf("%s%s",OFS,taxas[j])}; printf("\n") 
    for (i=1; i<=fni; i++) { 
    printf("%s",samples[i]); for (j=1;j<=ti;j++) { printf("%s%d",OFS,frequencies[samples[i],taxas[j]])}; printf("\n") 
    } 
}' 

テスト:

$ awk -F "," -v OFS="," ' 
FNR==1 {samples[++fni]=FILENAME} 
{if (!taxakeys[$2]) {taxakeys[$2]=1; taxas[++ti]=$2};frequencies[samples[fni],$2]+=$1} 
END { 
    printf("Sample"); for (j=1;j<=ti;j++) { printf("%s%s",OFS,taxas[j])}; printf("\n") 
    for (i=1; i<=fni; i++) { 
    printf("%s",samples[i]); for (j=1;j<=ti;j++) { printf("%s%d",OFS,frequencies[samples[i],taxas[j]])}; printf("\n") 
    } 
}' file_* 

Sample,Salmo salar,Solanum pennellii,Staphylococcus xylosus,Strongyloides stercoralis 
file_1,1,12,18,0 
file_2,1,0,14,123 
file_3,0,123,11,41 
+0

これは完全に機能しました。 –

1

マスターファイルはまったく必要ありません。私は最終的にテーブルを動的に生成します。あなたはPythonスクリプトにコマンドライン引数として入力ファイル名を渡すと仮定:

import sys 
from collections import defaultdict 

data = defaultdict(dict) # { taxon: { filename: count } }                

for filename in sys.argv[1:]: 
    with open(filename) as infile: 
     for line in infile: 
      count, taxon = line.rstrip().split(',') 
      data[taxon][filename] = count 

今、あなたはあなたの出力ファイルに必要なすべてであるdataを持っています。次に、このようにそれを印刷することができます。

taxa = data.keys() 
print "Sample,{}".format(','.join(taxa)) 
for filename in sys.argv[1:]: 
    print filename, 
    for taxon in taxa: 
     count = data[taxon].get(filename, "0") 
     sys.stdout.write("," + count) 
    print 
+0

シェルで 'python xyz.py file_1 file_2 file_3'と呼ぶことができますか? (私はすでにPythonの現在と以前のバージョンがインストールされていることを知っています)。 –

+0

@LuciaO:はい、それはあなたがそれを呼び出す方法です。 –

+0

"print" Sample、{} "。format( '、'。join(taxa))'には印刷する情報がありません。また、スクリプトはどのように出力ファイルを作成していますか?私はそのステップに完全に従いません(ごめんなさい、私はPythonで非常に新しいです)。 –

0

csv.Dictwriterを使用してみてください。

  1. ファイル名が{種名:カウント、種別:カウント}の辞書にある12個のファイルを読みます。
  2. master_list txtファイルをリストに読み込みます。
  3. 作成した辞書からcsvファイルを書き込むcsv.Dictwriterを使用します。ファイルに種のデータがない場合は0を指定するように指定することができます。ヘッダーはmaster_listの種のリストになります。
関連する問題