Я задал тот же вопрос на 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 простые, две колонки с кмером и все. Я действительно не знаю, будут ли все большие кмеры (например, 6 или выше) иметь одинаковые kmer ключей, потому что это я их считаю.

Например:

bacteria/species1/kmer2/example_csv_k2_count.csv

CSV-файл example_csv_k2_count.csv имеет следующую структуру:

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

Для каждого вида и счетчика кмеров мне нужно объединить CSV-файлы в один главный CSV для каждого счетчика кмеров (2-9). Например, для подкаталогов всех видов с числом kmer2 мне нужно

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

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

Для бактерий/видов2/кмер2:

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

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

Мне нужно сделать master kmer2_count.csv для каждого вида, и они подсчитывают kmer:

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);

Ex2 :

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

Теперь я использую python/pandas, и работа у меня работает, но для счетчиков кмеров больше 6, например 7, мой ноутбук работает 3 дня подряд. Я пытаюсь объединить это, чтобы получить среднее значение, потому что у многих видов геном был секвенирован много раз или потому, что они являются подвидами или штаммами. Затем я сделаю мастер-файл со средним значением всех секвенированных геномов.

Потому что это я хотел бы решение оболочки.

Спасибо, Пауло

PS = Извините за плохой текст, объясняющий мои потребности. Надеюсь, теперь стало понятнее. Мои извинения

0
Paulo Sergio Schlogl 19 Дек 2020 в 00:20
3
Цифры не понимаю: вижу 1300, 9 и 1-12000. Два вопроса на уровне вывода CSV: [A] Будут ли все файлы иметь точно такие же ключи kmer (aa, at и т. д.), или что произойдет, если в некоторых файлах будет лишний ключ, например aq, или отсутствует ключ aa (что приведет к рваные линии — не все строки имеют одинаковое количество столбцов). Вот где возникает ваша ошибка транспонирования. [B] Вы действительно предлагаете выводить строки CSV с 12 000 столбцов? Что вы ожидаете использовать для их обработки?
 – 
Paul_Pedant
18 Дек 2020 в 22:31
3
Действительно ли поля в ваших CSV-файлах разделены запятой и пробелом? Почему вы добавили пробелы в первые поля в результирующих CSV-файлах? С помощью csvjoin легко объединять (не объединять) CSV-файлы, но он обрабатывает только правильно отформатированные CSV-файлы. Также обратитесь к проблемам Paul_Pendant.
 – 
Kusalananda
18 Дек 2020 в 22:44
3
Этот вопрос не ясен и нуждается в некотором редактировании.
 – 
ctrl-alt-delor
18 Дек 2020 в 23:15
1
Ваш выходной файл кажется поддельным: если заголовок kmer,count, у вас должно быть ровно 2 столбца, а не по одному на входной файл.
 – 
umläute
18 Дек 2020 в 23:23
1
И чтобы иметь возможность использовать инструменты, которые работают с правильными форматами CSV, вы можете сначала предварительно обработать все файлы для правильного форматирования.
 – 
dirkt
19 Дек 2020 в 00:19

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

Вы можете использовать Miller и запустить

mlr --csv nest --implode --values --across-records -f count input1.csv input2.csv
2
aborruso 19 Дек 2020 в 01:28
1
Да... это идея @aborruso
 – 
Paulo Sergio Schlogl
19 Дек 2020 в 21:04
Хорошо, пожалуйста, дайте мне знать, если это работает
 – 
aborruso
20 Дек 2020 в 17:42
1
Как прошло?
 – 
aborruso
24 Дек 2020 в 12:31
Хорошо братан спасибо
 – 
Paulo Sergio Schlogl
28 Дек 2020 в 18:44
2
Лимит в лимите на количество открытых файлов для вашей платформы. Мне нужно было получить 9000 файлов, и я использовал этот режим github.com/johnkerl/ Миллер/вопросы/299#issuecomment-576149958
 – 
aborruso
31 Дек 2020 в 13:15