我知道在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 $_;
}
答案 0 :(得分:1)
这不是最优雅的方法,但是如果您知道它是3列(并且因为您要将美国截断为Unit),那么它会起作用:
#!/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
答案 1 :(得分:1)
单线:
$ perl -F'/\s{2,}/' -wlane 'print join(" ", map { substr($_, 0, 4) } @F)' a.txt
作为实际程序( 5 整行):
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