Bash 消除CSV中用于绘制线图的无用重复值

Bash 消除CSV中用于绘制线图的无用重复值,bash,csv,awk,sed,Bash,Csv,Awk,Sed,给定内容类似于以下内容的CSV文件: 2017-05-01,00:00:01,GRP1,GRP1,TOTAL,3 2017-05-01,00:00:01,GRP2,GRP2,TOTAL,0 2017-05-01,00:00:01,GRP3,GRP3,TOTAL,0 2017-05-01,00:00:11,GRP1,GRP1,TOTAL,3 2017-05-01,00:00:11,GRP2,GRP2,TOTAL,0 2017-05-01,00:00:11,GRP3,GRP3,TOTAL,0 201

给定内容类似于以下内容的CSV文件:

2017-05-01,00:00:01,GRP1,GRP1,TOTAL,3
2017-05-01,00:00:01,GRP2,GRP2,TOTAL,0
2017-05-01,00:00:01,GRP3,GRP3,TOTAL,0
2017-05-01,00:00:11,GRP1,GRP1,TOTAL,3
2017-05-01,00:00:11,GRP2,GRP2,TOTAL,0
2017-05-01,00:00:11,GRP3,GRP3,TOTAL,0
2017-05-01,00:00:21,GRP1,GRP1,TOTAL,3
使用bash或awk脚本整理并删除所有无用零的最佳方法是什么。我的意思是:这些数据将用于网页中的折线图。但是,通过JavaScript/jQuery等在web浏览器中读取整个CSV文件的速度非常慢。在上传文件之前消除无用的零会更有效。如果我去掉所有的零,所有的线或多或少都会显示峰到峰,而不是从零到某个更大的值再回到零的实线,后面是一个空格,直到下一个大于零的值

如您所见,数据列表中有3个组。任何时候一行中有3个,例如GRP1,我想删除该列表中的中间或第二个0。事实上,这也适用于大于零的值…如果连续10秒发现相同的值。。。最好将两端保持在原位,并移除项目2至9

折线图看起来是一样的,但数据处理起来要小得多。理想情况下,我可以在读取输入文件之前使用磁盘上的shell脚本来完成这项工作

因此(只看GRP1),而不是:

2017-05-01,00:00:01,GRP1,GRP1,TOTAL,3
2017-05-01,00:00:11,GRP1,GRP1,TOTAL,3
2017-05-01,00:00:21,GRP1,GRP1,TOTAL,3
2017-05-01,00:00:31,GRP1,GRP1,TOTAL,3
2017-05-01,00:00:41,GRP1,GRP1,TOTAL,3
2017-05-01,00:00:51,GRP1,GRP1,TOTAL,3
2017-05-01,00:01:01,GRP1,GRP1,TOTAL,2
脚本将删除所有无用的3个值…并只保留:

2017-05-01,00:00:01,GRP1,GRP1,TOTAL,3
2017-05-01,00:00:51,GRP1,GRP1,TOTAL,3
2017-05-01,00:01:01,GRP1,GRP1,TOTAL,2
2017-05-01,00:00:01,GRP2,GRP2,TOTAL,0
2017-05-01,00:00:51,GRP2,GRP2,TOTAL,0
2017-05-01,00:01:01,GRP2,GRP2,TOTAL,2
或者。。。另一个预期结果是这次使用0…而不是3作为GRP2的公共连续值

2017-05-01,00:00:01,GRP2,GRP2,TOTAL,0
2017-05-01,00:00:11,GRP2,GRP2,TOTAL,0
2017-05-01,00:00:21,GRP2,GRP2,TOTAL,0
2017-05-01,00:00:31,GRP2,GRP2,TOTAL,0
2017-05-01,00:00:41,GRP2,GRP2,TOTAL,0
2017-05-01,00:00:51,GRP2,GRP2,TOTAL,0
2017-05-01,00:01:01,GRP2,GRP2,TOTAL,2
该脚本将删除所有无用的0值…并只保留:

2017-05-01,00:00:01,GRP1,GRP1,TOTAL,3
2017-05-01,00:00:51,GRP1,GRP1,TOTAL,3
2017-05-01,00:01:01,GRP1,GRP1,TOTAL,2
2017-05-01,00:00:01,GRP2,GRP2,TOTAL,0
2017-05-01,00:00:51,GRP2,GRP2,TOTAL,0
2017-05-01,00:01:01,GRP2,GRP2,TOTAL,2
@karakfa的答案让我很接近,但在将awk应用于一个独特的组,然后消除一些由于某种原因出现的重复项后,仍然会得到类似的部分:

我喜欢它,但它仍然以这样的方式结束:

2017-05-02,00:05:51,DTE,DTE,TOTAL,2
2017-05-02,00:06:01,DTE,DTE,TOTAL,1
2017-05-02,00:06:51,DTE,DTE,TOTAL,1
2017-05-02,00:07:01,DTE,DTE,TOTAL,1
2017-05-02,00:07:51,DTE,DTE,TOTAL,1
2017-05-02,00:08:01,DTE,DTE,TOTAL,1
2017-05-02,00:08:51,DTE,DTE,TOTAL,1
2017-05-02,00:09:01,DTE,DTE,TOTAL,1
2017-05-02,00:09:51,DTE,DTE,TOTAL,1
2017-05-02,00:10:01,DTE,DTE,TOTAL,1
2017-05-02,00:10:51,DTE,DTE,TOTAL,1
2017-05-02,00:11:01,DTE,DTE,TOTAL,1
2017-05-02,00:11:51,DTE,DTE,TOTAL,1
2017-05-02,00:12:01,DTE,DTE,TOTAL,1
2017-05-02,00:12:51,DTE,DTE,TOTAL,1
2017-05-02,00:13:01,DTE,DTE,TOTAL,1
2017-05-02,00:13:51,DTE,DTE,TOTAL,1
2017-05-02,00:14:01,DTE,DTE,TOTAL,1
2017-05-02,00:14:51,DTE,DTE,TOTAL,1
2017-05-02,00:15:01,DTE,DTE,TOTAL,1
2017-05-02,00:15:11,DTE,DTE,TOTAL,1
2017-05-02,00:15:21,DTE,DTE,TOTAL,9
如果能做到这一点就太好了:

2017-05-02,00:05:51,DTE,DTE,TOTAL,2
2017-05-02,00:06:01,DTE,DTE,TOTAL,1
2017-05-02,00:15:11,DTE,DTE,TOTAL,1
2017-05-02,00:15:21,DTE,DTE,TOTAL,9
简单的awk方法:

awk -F, '$NF!=0' inputfile
输出:

2017-05-01,00:00:01,GRP1,GRP1,TOTAL,3
2017-05-01,00:00:11,GRP1,GRP1,TOTAL,3
2017-05-01,00:00:21,GRP1,GRP1,TOTAL,3


$NF=0
-只考虑那些没有将
0
作为最后一个字段值的行

awk
,以便救援

$ awk -F'[,:]' '$4==pt+10 && $NF==p {pt=$4; pl=$0; next} 
                pl                  {print pl} 
                                    {pt=$4;p=$NF}1' file

2017-05-01,00:00:01,GRP1,GRP1,TOTAL,3
2017-05-01,00:00:51,GRP1,GRP1,TOTAL,3
2017-05-01,00:01:01,GRP1,GRP1,TOTAL,2

这是一个不恰当的问题,但如果你不介意的话,我将尝试一下标题:

$ awk -F, ' {
    if($3 OFS $4 OFS $6 in first)
        last[$3 OFS $4 OFS $6]=$0
    else 
        first[$3 OFS $4 OFS $6]=$0 }
END { 
    for(i in first) {
        print first[i]
        if(i in last)
            print last[i] } 
}' file
2017-05-01,00:00:01,GRP1,GRP1,TOTAL,3
2017-05-01,00:00:21,GRP1,GRP1,TOTAL,3
2017-05-01,00:00:01,GRP2,GRP2,TOTAL,0
2017-05-01,00:00:11,GRP2,GRP2,TOTAL,0
2017-05-01,00:00:01,GRP3,GRP3,TOTAL,0
2017-05-01,00:00:11,GRP3,GRP3,TOTAL,0
基本上,它保留第三、第四和第六字段的每个唯一组合的第一次和最后一次(如果存在)出现

编辑:从“连续”这个词的新角度来看,这个可怕的黑客如何:

$ awk -F, '
(p!=$3 OFS $4 OFS $6) {
    if(NR>1 && lp<(NR-1))
        print q
    print $0
    lp=NR }
{
    p=$3 OFS $4 OFS $6
    q=$0 }
' file
2017-05-01,00:00:01,GRP1,GRP1,TOTAL,3
2017-05-01,00:00:01,GRP2,GRP2,TOTAL,0
2017-05-01,00:00:01,GRP3,GRP3,TOTAL,0
2017-05-01,00:00:11,GRP1,GRP1,TOTAL,3
2017-05-01,00:00:11,GRP2,GRP2,TOTAL,0
2017-05-01,00:00:11,GRP3,GRP3,TOTAL,0
2017-05-01,00:00:21,GRP1,GRP1,TOTAL,3
第三点:

2017-05-01,00:00:01,GRP2,GRP2,TOTAL,0
2017-05-01,00:00:51,GRP2,GRP2,TOTAL,0
2017-05-01,00:01:01,GRP2,GRP2,TOTAL,2

至少,显示预期的输出请为给定的输入添加预期的输出。感谢您的回答,但这将消除所有零,而不仅仅是我示例中的“无用”零。我想保留一些。特别是任何一个都是相同值的多个连续点的端点,因此它们仍然被绘制为0到0。。。在两端不需要所有0的情况下…对于给定的GRP@CJoe,保留一些意味着什么?您已经发布了预期结果,但您没有保留一些感谢您的回答,但我没有看到重复被消除,结果文件最终比我开始使用的文件大。您是否使用您提供的示例输入尝试了脚本?如果我首先grep获得1个唯一的GRP,然后应用您的awk,它工作正常,消除每分钟6次读数中的4次。但例如,在这里的示例文件中,从00:06:01到00:15:11,GRP1的值都是1。还有20排。如果只有两个就好了。第一个也是最后一个。。。这意味着你的样本数据不能代表你的真实情况。这里所有的记录都是相同的类型和排序的,这是提出的解决方案的主干。我同意,这不是最清楚的问题。很抱歉。对于整个文件中每个组的第一个和最后一个唯一值,您的答案令人印象深刻。现在的诀窍是在值更改之前仅将其应用于连续相同值的部分。若我首先为一个独特的组(3个组中的1个)创建一个文件,然后应用您的awk,它似乎工作得很好。谢谢仍在验证。