2

テキストファイルに次のデータがあります。

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

「SELECT LAST_COLUMN WHERE FIRST_COLUMN = '10993'」のようなことを行うために使用できる UNIX コマンドは次のとおりです。結果は次のようになります。

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 には、問題を簡単に解決できる厄介な自動分割モードがあります。

-a

-nまたはと一緒に使用すると、自動分割モードがオンになります-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

質問に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のさらに別の例では、ファイル名を最初の引数として、必須の最初のフィールドを2番目の引数として使用します。

#!/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 に答える
0

考えられる多くの方法の 1 つは awk です。

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