2

数字の列を含む3つの異なるファイルがあります。これらのファイルは非常に大きいです(50,000,000行以上あります)

例として、データ形式は次のようになります

1.2 22.333 10002.3432 223.2111
50.2166 2.873 15402.3432 322.1
.
.
.

ファイル(file1、file2、file3)ごとに、次のことを行う必要があります。

FILE1 任意の数x<=1000を含む行を検索し、file1から行を削除します

FILE2 任意の数x>=1800を含む行を検索し、file2から行を削除します

FILE3 任意の数1000<=x <= 1800を含む行を検索し、file3から行を削除します。

REGEXに関する私の知識は、これを迅速に達成する方法を理解するのに十分ではありません。どんな助けでも大歓迎です。

4

4 に答える 4

6

他の人がコメントで述べているように、この場合、正規表現は理想的ではありません。

これを使用してそれを行う1つの方法がありawkます:

awk '{for (i=1;i<=NF;i++) {if ($i<=1000) next}; if (NF) print}' file1 > new1

fileこれは、数値を含むすべての行<= 1000(および空の行)を解析して抑制します。次に、出力は新しいファイルにパイプされます。

file2およびについてfile3は、要件に一致するように、関連するifステートメントの条件を変更するだけです。


ここに簡単な説明があります:

         This is repeated for each line in the input file
                                |
      -------------------------------------------------------
     /                                                       \
awk '{for (i=1;i<=NF;i++) {if ($i<=1000) next}; if (NF) print}'
      ------------------   ------------------   -------------
             |                     |                  |
     for each field/column         |                  |
                                   |                  |
                      If condition is met, skip       |
                             this line                |
                                                      |
                                          otherwise, if the line is
                                          not empty (number of fields != 0)
                                          print out the whole line.
于 2012-06-22T12:14:02.713 に答える
5

入力ファイル「サンプル」は次のとおりです。

500 500 500
1000 1000 1000
2000 2000 2000
3000 3000 3000

ストリップx <= 1000

$ awk '{ for (i=1; i<=NF; i++) { if ($i <= 1000) next } print }' < sample
2000 2000 2000
3000 3000 3000

ストリップx >= 1800

$ awk '{ for (i=1; i<=NF; i++) { if ($i >= 1800) next } print }' < sample
500 500 500
1000 1000 1000

ストリップ1000 <= x <= 1800

$ awk '{ for (i=1; i<=NF; i++) { if (1000 <= $i && $i <= 1800) next } print }' < sample
500 500 500
2000 2000 2000
3000 3000 3000
于 2012-06-22T12:13:40.183 に答える
3

FILE3を出力するかなり短いPerlスクリプトは次のとおりです。

#!/usr/bin/perl

use warnings;
use strict;

our $lower = 1000.0;
our $upper = 1800.0;

OUTER: while (<>) {
    $_ >= $lower && $_ < $upper and next OUTER for /(\S+)/g;
    print;
}

FILE1とFILE2を調整できます。

(良くも悪くも、私のスクリプトは基本的なPerlイディオムで厚く、スクリプトの簡潔さにもかかわらず、Perlを知らないとほとんど読めなくなります。それでも、Perlで行われる方法は、学習を楽しむスクリプト言語です。容疑者1人。)

于 2012-06-22T12:14:16.627 に答える
0

次のスクリプトのようなものがあなたのために働くはずです。

#!/usr/bin/perl
while(<>) {
    my $line = $_;
    foreach my $col (split ' ', $line){     #for each column
        unless ($col <= 1000) {
            print $line;
        }
        #add other statements for other files
    }
}

編集-コードをより効率的にしましたありがとうTLP

于 2012-06-22T12:22:31.273 に答える