![我需要一种有效的方法来组合数千个 csv 文件](https://linux22.com/image/185171/%E6%88%91%E9%9C%80%E8%A6%81%E4%B8%80%E7%A7%8D%E6%9C%89%E6%95%88%E7%9A%84%E6%96%B9%E6%B3%95%E6%9D%A5%E7%BB%84%E5%90%88%E6%95%B0%E5%8D%83%E4%B8%AA%20csv%20%E6%96%87%E4%BB%B6.png)
我在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 文件很简单,两个 coulmn 与 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...
对于细菌/species2/kmer2:
specie2.csv1
kmer, count
aa, 22
at, 21...
specie2.csv2
kmer, count
aa, 31
at, 18...
我需要为每个物种制作一个主 kmer2_count.csv 并且它们的 kmer 计数:
kmer, count
aa, 22, 31,...
at, 21, 18,...
我尝试了在堆栈、谷歌中搜索的许多代码和命令,但我总是将它们堆叠起来:
kmer, count
aa, 31
at, 18...
kmer, count
aa, 22
at, 21...
我尝试过的 shell 命令示例:
$ 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 天。我试图将其合并以得出计数平均值,因为许多物种的基因组已测序多次,或者因为它们是亚种或品系。然后我将制作一个包含所有测序基因组平均值的主文件。
因为这个我会喜欢 shell 解决方案。
谢谢,保罗
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