Как я могу напечатать только определенные поля в файле, разделенном пробелами? - PullRequest
6 голосов
/ 19 марта 2010

У меня есть файл, содержащий следующую строку содержимого 1000 в следующем формате:

abc def ghi gkl

Как мне написать Perl-скрипт для печати только первого и третьего полей?

abc ghi

Ответы [ 9 ]

14 голосов
/ 23 марта 2010

Если для вас пока нет хорошего ответа, я постараюсь получить награду; -)

#!/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. Удачи! ; -)

13 голосов
/ 19 марта 2010

Это действительно пустая трата для чего-то столь же мощного, как Perl, поскольку вы можете сделать то же самое в одной простой строке awk.

awk '{ print $1 $3 }'

13 голосов
/ 19 марта 2010
perl -lane 'print "@F[0,2]"' file
9 голосов
/ 19 марта 2010
while ( <> ) {
    my @fields = split;
    print "@fields[0,2]\n";
}

и только для разнообразия в Windows:

C:\Temp> perl -pale "$_=qq{@F[0,2]}"

и в Unix

$ perl -pale '$_="@F[0,2]"'
4 голосов
/ 23 марта 2010

Я уверен, что не должен получать награду, так как вопрос требует результата, который будет дан в 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)

Преимущества: как говорили другие, нет необходимости изучать Перл, Awk, ничего, просто знать некоторые инструменты. Результат обоих вызовов можно сохранить на диск с помощью оператора «>» и оператора «>>».

4 голосов
/ 19 марта 2010

Как 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
1 голос
/ 19 марта 2010
while(<>){
  chomp;
  @s = split ;
  print "$s[0] $s[2]\n";
}

пожалуйста, начните изучать документацию

0 голосов
/ 19 мая 2015

Один простой способ:

(split)[0,2]

Пример:

$_ = 'abc def ghi gkl';
print( (split)[0,2] , "\n");
print( join(" ", (split)[0,2]  ),"\n");

Командная строка:

perl -e '$_="abc def ghi gkl";print(join(" ",(split)[0,2]),"\n")'
0 голосов
/ 09 апреля 2010
#!/usr/bin/env perl
open my$F, "<", "file" or die;
print join(" ",(split)[0,2])."\n" while(<$F>);
close $F
...