Обновить до вина 1.7. Следуйте указаниям здесь: http://geebzor.com/tech/linux/wow-ubuntu-linux-wine/ Хорошо работает для меня!
Предполагая, что вы хотите выводить как 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 снова?
Интересный вопрос. Хороший случай применения 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] Запустите его с каталогом с вашими файлами в качестве аргумента
Метод, используется для подсчета строк, подходит, если файлы не огромны. Если файлы есть, другой метод подсчета строк приведет к лучшей производительности.
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