수천 개의 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와 함께 두 개의 열로 간단하며 중요합니다.모든 더 큰 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 파일을 하나의 마스터 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

관련 정보