У меня есть следующая таблица
head v1 v2 v3 v4 v5 v6
stn2 1 4 1 1 4 2
stn2 1 4 1 1 4 2
stn3 1 4 1 1 4 2
stn4 1 4 1 1 4 3
stn4 1 4 1 1 4 2
stn5 1 4 1 1 4 4
stn6 1 3 1 1 4 3
stn7 4 4 1 1 4 4
stn8 4 4 1 1 4 3
stn9 2 4 1 1 4 3
Я хотел бы удалить все столбцы, содержащие только 1. Я поместил шесть столбцов в массивы со следующим длинным кодом:
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
use feature 'say';
open(my $RSKF, " < ../risks.txt") || die "open risks.txt: failed $! ($^E)";
my $line;
my $count;
my @one_column;
my @two_column;
my @three_column;
my @four_column;
my @five_column;
my @six_column;
my $one_column;
my $two_column;
my $three_column;
my $four_column;
my $five_column;
my $six_column;
my @remove;
my @keep1;
my $keepcount=0;
while($line = <$RSKF>){
push(@one_column, (split(/\s+/, $line))[2]);
push(@two_column, (split(/\s+/, $line))[3]);
push(@three_column, (split(/\s+/, $line))[4]);
push(@four_column, (split(/\s+/, $line))[5]);
push(@five_column, (split(/\s+/, $line))[6]);
push(@six_column, (split(/\s+/, $line))[7]);
}
Моя попытка пройти через четвертый столбец ниже не сработала.
$count=0;
for (my $i=1; $i < @four_column; ++$i){
if ($four_column[$i] ge '2'){
$count++;
}
if ($count > 0){
@four_column=@keep1;
$keepcount++;
}
else{
@four_column=@remove;
}
}
Конечно, должен быть более простой способ сделать это. Пожалуйста помоги.
Совет: Повторяющийся код — признак плохого кода. Если вы обнаружите, что создаете переменные для формы foo_number
или number_foo
, вам следует использовать массив. Кроме того, нет смысла разбивать строку на шесть раз!
Чтобы вывести отфильтрованную таблицу:
perl -lae '
push @rows, [@F];
next if $.==1;
for (keys @F) {
$wanted[$_] = 1 if $F[$_]!=1;
}
END {
@cols = grep {$wanted[$_]} keys @F;
for (@rows) {
print join "\t", @$_[@cols];
}
}
' original.txt >new.txt
Большое спасибо @jhnc, это делает именно то, что я хочу, и работает отлично. Я весьма признателен.
Извините, что пришел @jhnc. Когда я запускаю код в командной строке, он работает отлично. Но я хочу запустить его в скрипте. Когда я это делаю, я получаю сообщение об ошибке: «Строка найдена там, где ожидался оператор в строке 32 ./07_write_risks.pl, рядом с «}» (может быть, это неконтролируемая многострочная строка, начинающаяся со строки 20) (отсутствует точка с запятой в предыдущей строке) ?) и «Bareword «perl» не разрешен, пока используются «строгие подпрограммы» в строке 32 ./07_write_risks.pl». Я попытался запустить код как системную команду «system(/usr/bin/perl 'thecode). Результат хуже. Я буду признателен за вашу помощь.
@Zilore Mumba, это команда оболочки, а не код Perl. Вы не можете просто вставить команду оболочки в середину кода Perl и ожидать, что она сработает! Однако его очень легко преобразовать в код Perl.
line 32
? Вы пытаетесь внедрить это как часть другой более крупной программы?
Еще раз извините за мою ошибку, это работает при запуске внутри bash-скрипта.
Чтение каждого столбца в отдельную переменную — это странно и неуклюже. Создание списка списков является более гибким и общим, а также проще для этого варианта использования.