2

我在文本文件中有以下数据。

10993   39750   11002
10993   39751   10995
10993   39752   48981
10993   39750   344417  79600
10985   39750   344417  475879
110010  39750   59816

我可以使用哪些 unix 命令来执行诸如“SELECT LAST_COLUMN WHERE FIRST_COLUMN = '10993'”之类的操作,那么结果将是:

11002
10995
48981
79600
4

5 回答 5

8

不知道,perl但这里有一个awk解决方案:

awk '$1==10993 {print $NF}' file
11002
10995
48981
79600
于 2012-12-05T20:18:09.207 回答
1

Perl 有一个奇怪的自动拆分模式,可以简单地解决您的问题。

-一种

-n与 a或一起使用时打开自动拆分模式-p。对数组的隐式拆分命令是在or@F产生的隐式 while 循环中的第一件事。-n-p

perl -ane 'print pop(@F), "\n";'

相当于

while (<>) {
    @F = split(' ');
    print pop(@F), "\n";
}

可以使用 指定备用分隔符-F

让它在你的情况下工作看起来像

$ perl -lane 'print $F[-1] if $F[0] == 10993' input
11002
10995
48981
79600
于 2012-12-05T20:57:38.120 回答
1

我不认为当你可以使用命令行时,你应该更喜欢它的脚本。

perl -F -lane 'if($F[0]==10993){print $F[(scalar @F)-1]}' your_file

测试如下:

> cat temp
10993   39750   11002
10993   39751   10995
10993   39752   48981
10993   39750   344417  79600
10985   39750   344417  475879
110010  39750   59816
> perl -F -lane 'if($F[0]==10993){print $F[(scalar @F)-1]}' temp
11002
10995
48981
79600
于 2012-12-06T09:58:47.120 回答
0

许多可能的方法之一是 awk:

awk '-F\t' 'if ($1 == "wanted-first-column-value") { print $NF }'
于 2012-12-05T20:19:48.827 回答
0

看到你用 perl 标记了你的问题,这里有一些例子:

在 perl 中硬编码:

#!/usr/bin/perl
use warnings;
use strict;

open INFILE,"<somefilename";
while (<INFILE>)
{
    my @cols = split(/\s+/,$_);
    if ($cols[0] eq '10993') {      print $cols[-1] . "\n"; }
}

再次使用 perl,但取而代之的是从 STDIN 获取它,因此您可以将输出通过管道传输到它:

#!/usr/bin/perl
use warnings;
use strict;

while (<>)
{
    my @cols = split(/\s+/,$_);
    if ($cols[0] eq '10993') {      print $cols[-1] . "\n"; }
}

perl 中的另一个示例,将文件名作为第一个参数,将所需的第一个字段作为第二个参数:

#!/usr/bin/perl
use warnings;
use strict;

unless ($ARGV[0])    { die "No filename specified\n" }
unless ($ARGV[1])    { die "No required field specified\n" }
unless (-e $ARGV[0]) { die "Can't find file $ARGV{0]\n" }
open INFILE,"<ARGV{0]";
while (<INFILE>)
{
    my @cols = split(/\s+/,$_);
    if ($cols[0] eq $ARGV[1]) {     print $cols[-1] . "\n"; }
}

但是,只使用 awk 可能更容易:

awk '{if ($1 == 10993) {print $NF}}' someFileName
于 2012-12-05T20:22:51.710 回答