PERL для усечения входных столбцов текстовых файлов для вывода - PullRequest
0 голосов
/ 27 сентября 2018

Я знаю, что есть несколько примеров для усечения в Perl, однако для этой цели кода я не нашел решения для усечения текстового файла с 3 столбцами.

Моя цель - использовать PERL для усечения3 столбца в текстовом файле до 4 символов только при чтении и записи в текстовый файл.

Мой текстовый файл INPUT - input.txt: [Столбцы с номерами 1,2,3 и только для справки]

   1                       2                   3
   Rain                  65.22             London
   Snow                  34.44             United States
   Cloudy                23.00             Germany

Текстовый файл не разделен табуляцией, а содержит только пробелы.

Мой файл вывода OUTPUT - output.txt:

1                      2                    3
Rain                  65.2                  Lond
Snow                  34.4                  Unit
Clou                  23.0                  Germ

Вместо моего output.txt отображается:

Rain    Snow    Cloudy

Вот мой код:

#!/usr/bin/perl
use strict;
use warnings;


my $input = 'input.txt';

#open file for reading
open my $fhIn, '<', $input or die qq(Unable to open "$input" for input: $!);

#open file for writing
my $output = 'output.txt';
open my $fhOut, '>', $output or die "Can't create output.\n";


while( <$fhIn>) {

     (s/.{4}\K.*//s);
     print  $fhOut $_;         
}

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

В виде одной строки:

$ perl -F'/\s{2,}/' -wlane 'print join("  ", map { substr($_, 0, 4) } @F)' a.txt

В качестве актуальной программы ( пять целых строк):

use strict;
use warnings;

while (<DATA>) {
    print join('  ', map { substr($_, 0, 4) } split(/\s{2,}/)) . "\n";
}

__DATA__
Rain                  65.22             London
Snow                  34.44             United States
Cloudy                23.00             Germany
0 голосов
/ 27 сентября 2018

Это не самый элегантный способ, но если вы знаете, что это 3 столбца (и потому что вы обрезаете Соединенные Штаты до единицы), то это работает:

#!/usr/bin/perl
use strict;
use warnings;

my $input = 'input.txt';
open my $fhIn, '<', $input or die qq(Unable to open "$input" for input: $!);

my $output = 'output.txt';
open my $fhOut, '>', $output or die "Can't create output.\n";

while(<$fhIn>) {
    s/^\s+//;
    my ($f1, $f2 , $f3) = split /\s+/;
    $f1 = substr $f1, 0, 4;  
    $f2 = substr $f2, 0, 4;  
    $f3 = substr $f3, 0, 4;  
    printf $fhOut "%-4s %-4s %-4s\n",$f1,$f2,$f3; 
}

Это даствыходной файл (вы можете воспроизвести с интервалом или выравниванием по левому / правому столбцу, настроив printf):

1    2    3   
Rain 65.2 Lond
Snow 34.4 Unit
Clou 23.0 Germ
...