Скрипт Perl.
Задайте имя файла в $ в
вместо genome.txt
или укажите имя в качестве аргумента.
Назовите сценарий counter.pl
, дайте ему права на исполнение и запустите его как ./ counter.pl
chmod 755 counter.pl
./counter.pl
или, альтернативно,
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
Исправлен количество слов в строке (иногда 32, иногда 33 в примере).
В этой версии можно использовать любые варианты столбцов, но во всех строках должно быть одинаковое количество слов. Произойдет ошибка (строки die
), если количество слов другое, или если не удается открыть файлы.
Просто измените имя файла ( $ в
).
Входной файл: (удалили лишний 0 ближе к концу)
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