Как разделить столбец A файла данных на столбец B с помощью Perl - PullRequest
0 голосов
/ 10 декабря 2011

Мне дали текстовый файл с целой кучей данных, отсортированных по столбцам.Каждый из столбцов разделен запятыми.

Как можно разделить столбец на другой столбец, чтобы напечатать выходной ответ?Я сейчас использую Perl, так что это должно быть сделано в Perl.Как я мог это сделать?

Это то, что я имею до сих пор:

 #!/usr/bin/perl

 open (FILE, 'census2008.txt');
 while (<FILE>) {
     chomp;
     ($sumlev, $stname,$ctyname,$popestimate2008,$births2008,$deaths2008) = split(",");
 }
 close (FILE);
 exit;

Ответы [ 3 ]

4 голосов
/ 10 декабря 2011

Существует несколько вариантов:

  • Считать файл построчно, split столбцы на ',' и разделить соответствующие столбцы (донне забудьте обработать ошибку деления на ноль)

  • Сделайте то же самое, что и однострочный:

    $ perl -F/,/ -lane 'print( $F[1] == 0 ? "" : $F[3]/$F[1] )' file.txt
    
  • Используйте готовый к использованию модуль CPAN, такой как Text::CSV


Конечно, есть и другие неортодоксальные / сумасшедшие / невыразимые альтернативы - как TMTOWTDI ™Таким образом, можно:

  • Разобрать соответствующие столбцы с помощью регулярного выражения и разделить совпадения:

    if (/^\d*,(\d+),\d*,(\d+)/) { say $2/$1 if $2 != 0; }
    
  • Сделайте это с s///e:

    $ perl -ple 's!^\d*,(\d+),\d*,(\d+).*$! $2 == 0 ? "" : $2/$1 !e' file.txt;
    
  • Получить оболочку для грязной работы с помощью обратных галочек:

    sub print_divide { say `cat file.txt | some_command_line_command` }
    
1 голос
/ 10 декабря 2011
#!/usr/bin/env perl

# divides column 1 by column 2 of some ','-delimited file, 
# read from standard input.
# usage:
# $ cat data.txt | 8458760.pl 

while (<STDIN>) {
    @values = split(/,/, $_);
    print $values[0] / $values[1] . "\n";
}
0 голосов
/ 11 декабря 2011

Если у вас есть столбцы данных фиксированной ширины, вы можете использовать «распаковать» по строкам:

#!/usr/bin/env perl
use strict;
use warnings;
while (<DATA>) {
    chomp;
    my ($sumlev,$stname,$ctyname,$popest,$births,$deaths)
        = unpack("A2xA10xA15xA7xA5xA5");
    printf "%-15s %4.2f\n", $ctyname, $births/$deaths;
}
__DATA__
10,Main      ,My City        ,  10000,  200,  150
12,Poplar    ,Somewhere      ,   3000,   90,  100
13,Maple     ,Your Place     ,   9123,  100,   90
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...