PERL для усечения входных столбцов текстовых файлов для вывода
Я знаю, что есть несколько примеров для усечения в 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.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 ответа
Как однострочник:
$ 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
Это не самый элегантный способ, но если вы знаете, что это 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