2

行のグループを含むテキストファイルがあります。そこから、各グループの最初の3行だけが必要です。

ファイル:

test1|pass
test1|pass
test1|pass
test1|pass
test1|pass
test2|fail
test2|fail
test2|fail
test2|fail
test3|pass
test3|pass
test3|pass
test3|pass

期待される出力:

test1|pass
test1|pass
test1|pass
test2|fail
test2|fail
test2|fail
test3|pass
test3|pass
test3|pass

私がこれまでに試したこと:

BEGIN {
        FS = "|"
}
        $1==x {
        if (NR % 5 <= 3) {
                print $0
        }
        next
}
{
        x=$1
        print $0
}

END {
        printf "\n"
}
4

4 に答える 4

5

これは、次のようにかなり簡潔に行うことができます。

awk -F'|' '++a[$1] <= 3' infile

出力:

test1|pass
test1|pass
test1|pass
test2|fail
test2|fail
test2|fail
test3|pass
test3|pass
test3|pass

説明

a連想配列です。各行の最初の要素 ( $1) をキーとして使用し、aその値をインクリメントします。次に、この値が比較され3、比較が真の場合、デフォルト ブロックが実行されます ( {print $0})。

于 2013-02-07T11:23:26.220 に答える
1
BEGIN {
        FS = "|"
}
        $1==x && count <= 3 {
        print;
        count++;
        }
        next
}
{
        x=$1;
        print;
        count=1;
}
于 2013-02-07T11:24:06.187 に答える
1

awk を使用したその他の方法

awk '{a[$1]+=1}END{ for (b in a) {for(i=1; i<=3; i++) print b} }'  temp.txt | sort
于 2013-02-07T11:49:55.253 に答える
0

質問で示したようにデータが昇順になっている場合は、この perl コードを使用できます。

#!/usr/perl/bin -w

use strict;
use Data::Dumper;

my $file_name = "file.txt";
my $new_file = "new_file.txt";
open(FH, "<".$file) or die "Could not open $file";
open (NFH, ">$new_file") or die "Could not open $new_file";

my @content = <FH>;

my $old_line = "";
my $count = 0;
foreach my $line (@content) {

    if( ($old_line ne $line) || ($count < 3) ) {
        print NFH $line;
    }

    print NFH "$first $second $third";
}

close NFH;
close FH;

また

データが適切でない場合は、次の Perl コードを使用できます。

#!/usr/perl/bin -w
use strict;
use Data::Dumper;

my $file_name = "file.txt";
my $new_file = "new_file.txt";
open(FH, "<".$file) or die "Could not open $file";
open (NFH, ">$new_file") or die "Could not open $new_file";

my @content = <FH>;

my %hash = map($_ => 1) @content;
my $count = 0;
foreach my $key (keys(%hash)) {
    while($count < 3) {
    print NFH $key;
    $count++;
    }
}

close NFH;
close FH;
于 2013-02-07T11:35:59.480 に答える