如何仅在空格分隔文件中打印某些字段?

时间:2010-03-19 16:59:26

标签: perl split field

我有一个文件,其中包含以下格式的以下内容1000行:

abc def ghi gkl

如何编写Perl脚本以仅打印第一个和第三个字段?

abc ghi

9 个答案:

答案 0 :(得分:14)

如果没有答案对你有好处,我会尽力获得赏金; - )

#!/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。祝好运! ; - )

答案 1 :(得分:13)

perl -lane 'print "@F[0,2]"' file

答案 2 :(得分:13)

对于像perl这样强大的东西来说,这真的是一种浪费,因为你可以在一个简单的awk行中做同样的事情。

awk '{ print $1 $3 }'

答案 3 :(得分:9)

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 :(得分:4)

如perl one-liner:

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

答案 5 :(得分:4)

我确信我不应该得到赏金,因为问题要求在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,没什么,只知道一些工具。可以使用“&gt;”将两个调用的结果保存到磁盘和“&gt;&gt;”操作

答案 6 :(得分:1)

while(<>){
  chomp;
  @s = split ;
  print "$s[0] $s[2]\n";
}

请开始浏览documentation

答案 7 :(得分:0)

#!/usr/bin/env perl
open my$F, "<", "file" or die;
print join(" ",(split)[0,2])."\n" while(<$F>);
close $F

答案 8 :(得分:0)

一个简单的方法是:

(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")'