Как я могу подсчитать строки с именованными файлами и записать результат в файл csv?

Обновить до вина 1.7. Следуйте указаниям здесь: http://geebzor.com/tech/linux/wow-ubuntu-linux-wine/ Хорошо работает для меня!

1
задан 14 February 2016 в 20:02

2 ответа

Предполагая, что вы хотите выводить как 42, 19, 10207, 3 в каждой строке (без имен файлов), wc и некоторые Bash ing решают вашу проблему.

outfile="Result.csv" 
for samplenum in $( seq 1 100 ) ; do
    line=""
    for file in sample${samplenum}.* ; do
        numlines=$( wc -l <$file )
        line="$line $numlines,"
    done
    # remove the final comma
    line=${line%,}
    # not quoting $line below will suppress the initial blank 
    echo $line >> $outfile 
done

Прочитайте man bash, man wc, man seq и man bash снова

Отвечая на комментарий:

Вы читали man страницы?

$( seq 1 100) заменяется результатами команды seq 1 100, которая просто выводит целые числа от 1 до 100 (что скажет вам man seq). Замените его чем-то, что поставляет количество образцов, которые у вас есть.

Поместите код в файл (например, test.sh) и запустите его с bash -x test.sh, чтобы просмотреть подробности. Замените seq 1 100 на seq 1 2 для теста, чтобы избежать лавины выхода.

samplenum содержит номер образца, который для этого примера работает от 1 до 100.

sample, в sample${samplenum}.* является просто строкой. Он конкатенируется со значением samplenum и строкой .* для создания шаблона имени файла, например. sample1.* первый раз через петлю for samplenum ..., sample2.* второй раз и т. д.

Вы читали и понимали man bash, man wc, man seq и man bash снова?

1
ответ дан 23 May 2018 в 13:44
  • 1
    Спасибо, но можете ли вы объяснить мне, что он делает? каковы переменные сэмплен и образец и (после 1 100), что это значит? – Giulia L. 8 February 2016 в 14:47

Опция python

Интересный вопрос. Хороший случай применения python groupby()

Поскольку ваши файлы находятся в одном, «плоском» каталоге:

#!/usr/bin/env python3
from itertools import groupby
import os
import sys

dr = sys.argv[1]
# list the files in the directory, split into "sortable" elements
flist = [[item, item.split(".", 1)] for item in os.listdir(dr)]
# sort the file list by first section (until the first found dot)
flist.sort(key=lambda x: x[1][0])
# create sub groups of the files, grouped by first section of name
for key, line in groupby(flist, lambda x: x[1][0]):
    line = list(line)
    # sort the files by second section of name for correct order in the csv lines
    line.sort(key=lambda x: x[1][1])
    # count the lines of the files, arrange the csv file
    print((", ").join([str(len(open(dr+"/"+f[0]).readlines())) for f in line]))

Как это работает

Если каталог содержит девять файлов:

sample1.ext                  2 lines
sample1.ext2                 3 lines
sample1.ext3                 3 lines

sample2.ext                  1 lines
sample2.ext2                 1 lines
sample2.ext3                 4 lines

sample3.ext                  6 lines
sample3.ext2                 1 lines
sample3.ext3                 4 lines
Сценарий отображает файлы, разбивает каждое из имен на два раздела, например:
sample2
и
ext2
, так как порядок строк и файла длина внутри линий зависит от точной сортировки этих двух секций. Затем скрипт сортирует файлы по первому разделу имени, так как длина каждого из файлов (с похожим названием) должна быть сгруппирована для первого раздела в одну строку; sample1, sample2, sample3 и т. д. Впоследствии подгруппы (по строке csv) создаются, правильно сортируются по второму разделу имен, чтобы номера (line-) отображались в правильном порядке в строке

Результат:

python3 '/home/jacob/Bureaublad/create_csv.py' '/home/jacob/Bureaublad/samples' 
2, 3, 3
1, 1, 4
6, 1, 4

Как использовать

Сценарий отображает файлы, разбивает каждое из имен на два раздела, например:
sample2
и
ext2
, так как порядок обоих строки и длина файла внутри строк зависят от точной сортировки этих двух разделов.

Скрипт перечисляет файлы, разбивает каждое из имен на два раздела, например:

python3 /path/to/create_csv.py /path/to/directory_with_files
[ ! d18]

Важное примечание

Запустите его с каталогом с вашими файлами в качестве аргумента

EDIT

Метод, используется для подсчета строк, подходит, если файлы не огромны. Если файлы есть, другой метод подсчета строк приведет к лучшей производительности.

item.split(".", 1)

В результате последней информации, добавленной к вашему вопросу, была отредактирована версия скрипта. По совпадению, не так много нужно изменить: скрипт уже разбил имена файлов на первую найденную точку командой:

Поскольку последний раздел имени .bam, который равен огромный , это бессмысленно для порядка сортировки.

str(len(open(dr+"/"+f[0]).readlines()))

Тогда нам нужно только заменить «старый» способ подсчета строк файла:

str(subprocess.check_output(["samtools", "view", "-c", dr+"/"+f[0]]).decode("utf-8").strip())

Отредактированный сценарий

#!/usr/bin/env python3
from itertools import groupby
import os
import sys
import subprocess

dr = sys.argv[1]
# list the files in the directory, split into "sortable" elements
flist = [[item, item.split(".", 1)] for item in os.listdir(dr)]
# sort the file list by first section (until the first found dot)
flist.sort(key=lambda x: x[1][0])
# create sub groups of the files, grouped by first section of name
for key, line in groupby(flist, lambda x: x[1][0]):
    line = list(line)
    # sort the files by second section of name for correct order in the csv lines
    line.sort(key=lambda x: x[1][1])
    # count the lines of the files, arrange the csv file
    print((", ").join([
        str(subprocess.check_output(["samtools", "view", "-c", dr+"/"+f[0]]).decode("utf-8").strip())
        for f in line]))

Обратите внимание на

by (реализация python и интеграция в скрипт-) команды, которую вы предоставили:

mapped.bam, rmdup.bam, sort.bam  
1
ответ дан 23 May 2018 в 13:44
  • 1
    Он работает очень красиво, быстро и прекрасно отвечает на то, что я искал. Спасибо за ваше объяснение и ваше время, потраченное на эту приятную работу. Могу ли я просто спросить вас, что такое «подпроцесс»? сделать в новой версии? – Giulia L. 12 February 2016 в 15:05
  • 2
    @GiuliaL. Команда samtools view -c (file) не является "родной" команда python. Поэтому нам необходимо «подключить». python, чтобы прочитать его вывод. Для этого мы используем модуль subprocess, см. Также (например,): sharats.me/the-ever-useful-and-neat-subprocess-module.html – Jacob Vlijm 12 February 2016 в 15:11
  • 3
    Отлично, спасибо за ссылку, очень полезно! – Giulia L. 12 February 2016 в 15:39

Другие вопросы по тегам:

Похожие вопросы: