У меня есть файл, содержащий следующее содержание 1 000 строк в следующем формате:
abc def ghi gkl
Как я могу записать сценарий Perl для печати только первого и третьих полей?
abc ghi
Если вам пока нет ответа, я постараюсь получить награду; -)
#!/usr/bin/perl
# Lines beginning with a hash (#) denote optional comments,
# except the first line, which is required,
# see http://en.wikipedia.org/wiki/Shebang_(Unix)
use strict; # http://perldoc.perl.org/strict.html
use warnings; # http://perldoc.perl.org/warnings.html
# http://perldoc.perl.org/perlsyn.html#Compound-Statements
# http://perldoc.perl.org/functions/defined.html
# http://perldoc.perl.org/functions/my.html
# http://perldoc.perl.org/perldata.html
# http://perldoc.perl.org/perlop.html#I%2fO-Operators
while (defined(my $line = <>)) {
# http://perldoc.perl.org/functions/split.html
my @chunks = split ' ', $line;
# http://perldoc.perl.org/functions/print.html
# http://perldoc.perl.org/perlop.html#Quote-Like-Operators
print "$chunks[0] $chunks[2]\n";
}
Чтобы запустить этот скрипт, учитывая его название это script.pl
, вызовите его как
perl script.pl FILE
, где FILE
- это файл, который вы хотите проанализировать. См. Также http://perldoc.perl.org/perlrun.html . Удачи! ; -)
В однострочном формате perl:
perl -ane 'print "@F [0,2] \ n"' file
Или как исполняемый сценарий:
#!/usr/bin/perl
use strict;
use warnings;
open my $fh, '<', 'file' or die "Can't open file: $!\n";
while (<$fh>) {
my @fields = split;
print "@fields[0,2]\n";
}
Выполните сценарий следующим образом:
perl script.pl
или
chmod 755 script.pl
./script.pl
Это действительно нерационально для такого мощного языка, как perl, поскольку вы можете сделать то же самое в одной тривиальной строке awk.
awk '{ print $1 $3 }'
while(<>){
chomp;
@s = split ;
print "$s[0] $s[2]\n";
}
пожалуйста, начните изучать также документацию
while ( <> ) {
my @fields = split;
print "@fields[0,2]\n";
}
и просто для разнообразия, в Windows:
C:\Temp> perl -pale "$_=qq{@F[0,2]}"
и в Unix
$ perl -pale '$_="@F[0,2]"'
Я уверен, что не получу награду, так как вопрос требует, чтобы результат был указан в perl, но в любом случае:
В bash / ksh / ash / etc:
cut -d " " -f 1,3 "file"
В Windows / DOS:
for /f "tokens=1-4 delims= " %i in (file) do (echo %i %k)
Преимущества: как говорили другие, не нужно изучать Pearl, Awk, ничего, просто знание некоторых инструментов. Результат обоих вызовов можно сохранить на диск с помощью операторов «>» и «>>».
#!/usr/bin/env perl
open my$F, "<", "file" or die;
print join(" ",(split)[0,2])."\n" while(<$F>);
close $F