-1

私はこのようなテキストファイルを持っています:

A   B   C   D   E
----------------------  
x   x   e   2   10
y   y   g   1   8 
z   o   e   2   9 
o   o   q   1   10
p   z   e   3   22
x   x   e   1   11
z   o   a   1   24
y   z   b   1   25

awkこれと同じことを使用したいSQL

select A, 
       B, 
       count(distinct C), 
       sum(D),
       sum(case when E>20 then E else 0 END) 
  from test 
 group by A,B

出力:

A   B  count(distinct C)    sum(D)  sum(case when E>20 then E else 0 END) 
-------------------------------------------------------
o   o   1       1       0
p   z   1       3       22
x   x   1       3       0
y   y   1       1       0
y   z   1       1       25
z   o   2       3       24

これが私の解決策ですが、明確な部分は完了していません:

awk '
{
    idx4[$1"|"$2]=idx4[$1"|"$2]+$4;
    idx5[$1"|"$2]=$5>20?idx5[$1"|"$2]+$5:idx5[$1"|"$2]
} 
END {
    for (i in idx4) print i, idx4[i], idx5[i]
}' OFS="\t" test

================================================== ===========================

私はこれを数時間で完了しました、これが私のコードです:

    {
        if (idx3[$1"|"$2, $3] == 0) {
            idx3[$1"|"$2, $3]+=1;
        }
        idx4[$1"|"$2]=idx4[$1"|"$2]+$4;
        idx5[$1"|"$2]=$5>20?idx5[$1"|"$2]+$5:idx5[$1"|"$2]
    } 
    END {
        for (j in idx3) {
            split(j, idx, SUBSEP)
            count[idx[1]]++
        }
        for (i in idx4) {
            print i, count[i], idx4[i], idx5[i] 
        }
    } OFS="\t"

@Scrutinizerは以下のより読みやすいコードを提供しています、私はそれがより良いと思います。

4

3 に答える 3

1

これを試してください(独自のソリューションと同様):

awk '
  NR<3{
    next
  }

  {
    i=$1 OFS $2
    D[i]+=$4
  }

  !A[i,$3]++{
    C[i]++
  }

  $5>20{
    E[i]+=$5
  }

  END{
    for(i in D)print i, C[i], D[i], E[i]+0
  }
' OFS='\t' infile

NR<32つのヘッダー行をスキップするために使用されます。それらが入力ファイルに存在しない場合は、そのセクションを省略できます。

于 2013-03-14T20:10:43.250 に答える
1

このスクリプトを試してみてください。期待どおりの結果が得られるかどうかをテストしました。

awk '
{
    if( NR<3) {next}

    idx4[$1"|"$2]=idx4[$1"|"$2]+$4;
    idx5[$1"|"$2]=$5>20?idx5[$1"|"$2]+$5:idx5[$1"|"$2]

    if( index(TR[$1"|"$2],$3)==0 )
    {
         TR[$1"|"$2] = TR[$1"|"$2]"|"$3;
         TRD[$1"|"$2] +=1;
    }
} 
END {
    for (i in idx4) print i, TRD[i], idx4[i], idx5[i]+0
}' OFS="\t" test
于 2013-03-15T05:22:34.800 に答える
0
$ gawk '{ a[$1,$2]["C"][$3]; a[$1,$2]["D"]+=$4; a[$1,$2]["E"]+=($5>20 ? $5:0) }
END { 
    PROCINFO["sorted_in"] = "@ind_str_asc"
    for ( i in a) { 
        split(i, b, SUBSEP) 
        print b[1], b[2], length(a[i]["C"]), a[i]["D"], a[i]["E"] 
    }
}' OFS='\t' file
o       o       1       1       0
p       z       1       3       22
x       x       1       3       0
y       y       1       1       0
y       z       1       1       25
z       o       2       3       24
于 2017-06-24T05:56:48.223 に答える