Você pode usar este script Perl:
#! /usr/bin/perl
use strict;
use warnings;
my @names;
my @files;
@ARGV == 1 || die();
opendir(my $dir, $ARGV[0]) || die $!;
while(readdir($dir)) {
if($_ =~ /(.*)\.(sort|mapped|rmdup)\.bam$/) {
grep(/^$1$/, @names) == 0 && push(@names, $1);
}
}
close($dir);
foreach my $name (sort(@names)) {
my @fields;
push(@fields, $name);
foreach my $extension ("sort", "mapped", "rmdup") {
if(! -f "$ARGV[0]/$name.$extension.bam") {
push(@fields, 0);
print STDERR "'$ARGV[0]/$name.$extension.bam' missing\n";
next;
}
my $count = '<"$ARGV[0]/$name.$extension.bam" wc -l';
chomp($count);
push(@fields, $count)
}
print(join(", ", @fields)."\n")
}
Salve-o em algum lugar em seu sistema, torne-o executável e execute-o passando o diretório como um argumento:
path/to/script path/to/directory
% tree directory
directory
├── name.mapped.bam
├── name.rmdup.bam
├── name.sort.bam
├── othername.mapped.bam
├── othername.rmdup.bam
└── othername.sort.bam
0 directories, 6 files
% perl script.pl directory
name, 0, 0, 0
othername, 0, 0, 0
% for f in directory/*.sort.bam; do printf 'line\n' >>"$f"; done
% perl script.pl directory
name, 1, 0, 0
othername, 1, 0, 0
O que o script faz é:
- Itera todos os arquivos em
path/to/directory
; se um nome de arquivo corresponder a.*\.(sort|mapped|rmdup)\.bam$
, anexa a sequência antes de.sort.bam
,.mapped.bam
ou.rmdup.bam
a uma lista@names
se ainda não estiver na lista; - Para cada nome na lista
@names
classificada como$name
, acrescenta$name
a uma lista@fields
; para cada extensão emsort
,mapped
ermdup
as$extension
verifica se$name.$extension.bam
existe empath/to/directory
; se o arquivo não existir, anexa0
a@fields
, imprime uma mensagem de erro e passa para o próximo$extension
/$name
; se o arquivo existir, anexa a saída de<"$name.$extension.bam" wc -l
a@fields
; uma vez que todos os valores possíveis para$extension
foram iterados, imprime uma linha contendo os elementos de@fields
unidos em,
.