何千ものCSVファイルを結合する効率的な方法が必要です。

何千ものCSVファイルを結合する効率的な方法が必要です。

stackoverflowにも同じ質問をしましたが、満足のいく答えが得られませんでした。

次のディレクトリツリーがあります。

bacteria > species(num subdirs = 1300) > kmer(num subsudirs = 9)

ディレクトリとサブディレクトリは次のように結合されます。

bacteria/specie1/kmer2/csv
                    kmer3/csv
                    .
                    .
                    kmer9/csv

         specie2/kmer2/csv
                    kmer3/csv
                    .
                    .
                    kmer9/csv

         specie1300/kmer2/csv
                    kmer3/csv
                    .
                    .
                    kmer9/csv

kmerサブディレクトリにはcsvファイルがあり、種に応じて1つ以上のファイルがあります。

csvファイルはkmerと一緒に2つの列でシンプルで重要です。すべてのより大きなkmer(例えば6つ以上)が計算しているので、同じkmerキーを持つことになるかどうかはわかりません。

たとえば、

bacteria/species1/kmer2/example_csv_k2_count.csv

csv example_csv_k2_count.csvの構造は次のとおりです。

kmer,count
AA, 10
AC, 20
.
.
.

各種とkmerの数について、各kmerの数(2-9)のcsvファイルを1つのマスターcsvにリンクする必要があります。たとえば、kmer2 の数を持つすべての種のサブディレクトリには、次のものが必要です。

specie1.csv1
kmer, count
aa, 22
at, 21...

specie1.csv2
kmer, count
aa, 31 
at, 18...

細菌/種2/kmer2の場合:

specie2.csv1
kmer, count
aa, 22
at, 21...

specie2.csv2
kmer, count
aa, 31 
at, 18...

各種とそのkmer数のマスターkmer2_count.csvを作成する必要があります。

kmer, count
    aa, 22, 31,...
    at, 21, 18,...

スタック、Googleが検索した多くのコードとコマンドを試しましたが、常にスタックに表示されます。

kmer, count
    aa, 31 
    at, 18...
kmer, count
    aa, 22
    at, 21...

私が試したシェルコマンドの例:

    $ cat */kmer2/*.csv | datamash -t , transpose
    datamash: transpose input error: line 275 has 1 fields (previous lines had 2);

例2:

 awk '
            FNR==1 && NR!=1 { while (/^<header>/) getline; }
            1 {print}
        ' */kmer9/*.csv > ex.csv

今私はpython / pandasを使用しており、作業は完了しますが、kmerの数が6より大きい場合(たとえば7)、私のラップトップは3日間動作し続けます。多くの種のゲノム配列が複数回指定されているか亜種または系統であるため、数平均を算出するためにこれらを結合しようとしました。次に、配列決定されたすべてのゲノムの平均を含むマスターファイルを作成します。

このため、私はシェルソリューションを好む。

ありがとう、ポール

PS=申し訳ありません。私の要件を説明するテキストはありません。今は明確になることを願っています。すみません。

ベストアンサー1

私はあなたの目標を理解しているかどうかわかりません。

必要に応じて

cat input1.csv
kmer,count
aa,22
at,21

cat input2.csv
kmer,count
aa,31 
at,18

到着

それはまるで

kmer,count
aa,22;31
at,21;18

あなたはそれを使用することができますミラーそして走る

mlr --csv nest --implode --values --across-records -f count input1.csv input2.csv

おすすめ記事