从日期时间提取日期 - 更改。到,并打印不同领域的总结

时间:2015-01-02 10:37:09

标签: awk

aNumber bNumber startDate   cost    balanceAfter    trafficCase Operator    unknown3    MainAmount  BALANCEBEFORE
22676239633 433 2014-07-02 10:16:48.000 0,00    0.20    0   Short Code  397224944   0.0000  0.2000
22677277255 76919167    2014-07-02 10:16:51.000 1,00    92.60   0   Airtel  126268625   0.0000  92.6000
22676777508 76701575    2014-07-02 10:16:55.000 1,00    217.00  0   Airtel  4132186103  0.0000  217.0000
22665706841 433 2014-07-02 10:16:57.000 0,00    69.50   0   Short Code  4133821554  0.0000  69.5000
22665799922 70110055    2014-07-03 10:16:45.000 20,00   0.50    0   Telmob  126260244   20.0000 0.5000
22676239633 433 2014-07-03 10:16:48.000 0,00    0.20    0   Short Code  397224944   0.0000  0.2000
22677277255 76919167    2014-07-04 10:16:51.000 1,00    92.60   0   Airtel  126268625   0.0000  92.6000
22676777508 76701575    2014-07-04 10:16:55.000 1,00    217.00  0   Airtel  4132186103  0.0000  217.0000
22665706841 433 2014-07-05 10:16:57.000 0,00    69.50   0   Short Code  4133821554  0.0000  69.5000

以下是我拥有的数据示例。我想在每次更改日期时总结costbalanceAfterMainAmountBALANCEBEFORE,但我担心的是我的日期与时间相结合,我的小数点分隔符是点而不是逗号,所以我的awk脚本无法执行操作。 我可以使用AWK脚本,它首先只提取日期,所以最后我会得到一个输出:

Date        Cost    balanceAfter    MainAmount  BALANCEBEFORE
02/07/2014  2,00    379,3                0          379,3
03/07/2014  20,00   0,7                 20            0,7
04/07/2014  2,00    309,6                0          309,6
05/07/2014  0,00    69,5                 0           69,5

这是我的AWK SCRIPT

awk -F 'NR==1 {header=$0; next} {a[$3]+=$4 a[$3]+=$5 a[$3]+=$9 a[$3]+=$10} END {for (i in a) {printf "%d\t%d\n", i, a[i]}; tot+=a[i]};' out.txt>output.doc

2 个答案:

答案 0 :(得分:1)

编辑:根据Etan Reisner的建议,避免使用$NF处理Operator列中不同数量的令牌的预处理步骤。

$ cat data.txt
aNumber bNumber startDate   cost    balanceAfter    trafficCase Operator    unknown3    MainAmount  BALANCEBEFORE
22676239633 433 2014-07-02 10:16:48.000 0,00    0.20    0   Short Code  397224944   0.0000  0.2000
22677277255 76919167    2014-07-02 10:16:51.000 1,00    92.60   0   Airtel  126268625   0.0000  92.6000
22676777508 76701575    2014-07-02 10:16:55.000 1,00    217.00  0   Airtel  4132186103  0.0000  217.0000
22665706841 433 2014-07-02 10:16:57.000 0,00    69.50   0   Short Code  4133821554  0.0000  69.5000
22665799922 70110055    2014-07-03 10:16:45.000 20,00   0.50    0   Telmob  126260244   20.0000 0.5000
22676239633 433 2014-07-03 10:16:48.000 0,00    0.20    0   Short Code  397224944   0.0000  0.2000
22677277255 76919167    2014-07-04 10:16:51.000 1,00    92.60   0   Airtel  126268625   0.0000  92.6000
22676777508 76701575    2014-07-04 10:16:55.000 1,00    217.00  0   Airtel  4132186103  0.0000  217.0000
22665706841 433 2014-07-05 10:16:57.000 0,00    69.50   0   Short Code  4133821554  0.0000  69.5000


$ cat so2.awk
NR > 1 {
    cost = $5;
    balanceAfter = $6;
    mainAmount = $(NF - 1);
    balanceBefore = $NF;

    sub(",", ".", cost);
    sub(",", ".", balanceAfter);
    sub(",", ".", mainAmount);
    sub(",", ".", balanceBefore);

    dateCost[$3] += cost;
    dateBalanceAfter[$3] += balanceAfter;
    dateMainAmount[$3] += mainAmount;
    dateBalanceBefore[$3] += balanceBefore;
}

END {
    printf("%s\t%s\t%s\t%s\t%s\n", "Date", "Cost", "BalanceAfter", "MainAmount", "BalanceBefore");
    for (i in dateCost) {
        printf("%s\t%f\t%f\t%f\t%f\n", i, dateCost[i], dateBalanceAfter[i], dateMainAmount[i], dateBalanceBefore[i]);
    }
}


$ awk -f so2.awk data.txt
Date    Cost    BalanceAfter    MainAmount  BalanceBefore
2014-07-02  2.000000    379.300000  0.000000    379.300000
2014-07-03  20.000000   0.700000    20.000000   0.700000
2014-07-04  2.000000    309.600000  0.000000    309.600000
2014-07-05  0.000000    69.500000   0.000000    69.500000

答案 1 :(得分:0)

这不需要预处理文件:

awk '
    BEGIN {print "Date Cost BalanceAfter MainAmount BalanceBefore"}
    NR == 1 {next} 
    function showday() {
        printf "%s\t%.2f\t%.1f\t%d\t%.1f\n", date, cost, bAfter, main, bBefore
    }
    date != $3 {
        if (date) showday()
        date = $3
        cost = bAfter = main = bBefore = 0
    } 
    {
        sub(/,/, ".", $5)
        cost += $5
        bAfter += $6
        main += $(NF-1)
        bBefore += $NF
    }
    END {showday()}
' file | column -t
Date        Cost   BalanceAfter  MainAmount  BalanceBefore
2014-07-02  2.00   379.3         0           379.3
2014-07-03  20.00  0.7           20          0.7
2014-07-04  2.00   309.6         0           309.6
2014-07-05  0.00   69.5          0           69.5