script Perl.
Defina o nome do arquivo em $in
no lugar de genome.txt
ou dê o nome como argumento.
Nomeie o script counter.pl
e dê a ele direitos executáveis e execute-o como ./counter.pl
chmod 755 counter.pl
./counter.pl
ou alternativamente
chmod 755 counter.pl
./counter.pl genome.txt
counter.pl:
#!/usr/bin/perl
use strict;
use warnings;
my $in = $ARGV[0] || 'genome.txt'; # input file name
open (my $F, '<', $in) or die "Cannot open input file $!";
my $n = 0;
my %fd = ();
my @fd = ();
while (<$F>) {
# trim
s/^\s+//;
s/\s+$//;
next if (!$_); # Skip empty lines
my @x = split(/\s+/, $_);
# 1st line, open files
if ( ! $n++) {
my $fd = 0;
for (@x) {
open ($fd{$_}, '>', "output$_.txt")
or die ("Cannot open file $!")
if (!exists($fd{$_}));
$fd[$fd++] = $_;
}
}
else { # Write data
die ("Should have " . ($#fd+1) . " entries on line $n")
if ($#x != $#fd);
for (0 .. $#x) {
print {$fd{$fd[$_]}} ($x[$_]);
}
print {$fd{$_}} ("\n") for (keys %fd);
}
}
close $fd{$_} for (keys %fd);
close $F;
# the end
Corrigido o número de palavras por linha (às vezes era 32, às vezes 33 no exemplo).
Esta versão pode acomodar qualquer variação de colunas, mas todas as linhas precisam ter o mesmo número de palavras. Um erro ocorrerá (as linhas die
) se o número de palavras for diferente ou se não puder abrir arquivos.
Basta ajustar o nome do arquivo ( $in
).
Arquivo de entrada: (removeu o 0 extra perto do final)
1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 3 3 3 3 3 3 4 4 4 4 4 4 4 30 30 30 30
0 2 2 0 2 0 2 0 2 0 2 2 0 0 2 2 2 0 1 1 1 2 0 2 0 0 0 2 0 2 0 2
0 2 1 0 1 0 1 1 1 0 2 2 0 0 2 2 2 0 0 0 0 2 0 2 0 0 1 2 0 2 0 2
0 2 1 0 1 0 1 1 1 0 2 2 0 0 2 2 2 0 0 0 0 2 0 2 0 0 1 2 0 2 0 2
output1.txt
02202020
02101011
02101011
output2.txt
2022002
1022002
1022002
output30.txt
0202
0202
0202
output3.txt
220111
220000
220000
output4.txt
2020002
2020012
2020012