Удалить строки в файле, которые не имеют определенных шаблонов в определенных столбцах - PullRequest
1 голос
/ 20 июля 2011

У меня есть текстовый файл с разделителями табуляции.Я разделил это на столбцы.Каждый из первых 2 столбцов содержит идентификационный номер.

Я хочу сохранить все строки с идентификационным номером, начинающимся с P или Q, и удалить любые другие строки, где столбец 1 или 2 имеет любой другой идентификатор или является пустым.

например.поэтому столбцы, которые нужно сохранить, будут выглядеть так: P12345 или Q12345.Колонки, от которых нужно избавиться, будут GAG123, CH123 и т. Д. Или просто пустыми.

Я не могу понять, как это сделать.Я пробовал разбивать строки на массивы и grep / ^ [PQ] / elements [0] и [1] и другие разные вещи, но я, должно быть, делаю что-то не так.

Я пробовал следующий кодниже TLP, но это не сработает, я знаю, что, должно быть, делаю что-то в корне неправильно:

#!/usr/bin/perl  

use warnings;
use strict;

open(FILE,"<myfile.txt"); 
my @LINES = <FILE>; 
open(my $outfile, '>', 'changedtxt');
my @wanted;

while (<FILE>) {
    my @fields = split('\t', $_);
    if ( $fields[0] =~ /^[PQ]/ and $fields[1] =~ /^[PQ]/ ) {
        push @wanted, $_;  
        print {$outfile} $_;    
    }
}
exit:

Ответы [ 3 ]

3 голосов
/ 20 июля 2011

Вы можете использовать awk для распечатки записей, где первое или второе поле начинается с P или Q:

awk -F'\t' '$1~/[PQ].*/ || $2~/[PQ].*/ {print}'  file
1 голос
/ 20 июля 2011

Вы также можете сделать это в одну строку:

cat yourfile.txt | perl -e 'while (<>) { print if m/^[PQ]/xmsi && m/\t+[PQ]/xmsi }
1 голос
/ 20 июля 2011
use strict;
use warnings;

my @wanted;
while (<$fh>) {
    my @fields = split /\t/, $_;
    if ( $fields[0] =~ /^[PQ]/ or $fields[1] =~ /^[PQ]/ ) {
        push @wanted, $_;
    }
}

Если вы хотите, чтобы оба идентификатора начинались с P или Q, замените or на and.

Если вы просто хотите переместить нужные строки в другой файл, просто выполните:

perl -wnae 'print if (($F[0] =~ /^[PQ]/) or ($F[1] =~ /^[PQ]/))' input.txt > output.txt

Или как скрипт, используйте с script.pl input.txt > output.txt:

use warnings;
use strict;

while (<>) {
    my @fields = split(/\t/, $_);
    print if ( $fields[0] =~ /^[PQ]/ and $fields[1] =~ /^[PQ]/ );

} 

Обратите внимание, что вы не можете использовать '\t' в качестве шаблона разделения.

...