2017-05-02 8 views
0

をグラフ化ライン用のCSVから値の無駄な繰り返しを排除します。役に立たないとは、このデータがWebページの折れ線グラフに使用されることを意味します。しかし、JavaScript/jQueryなどを介してWebブラウザでCSVファイル全体を読むのは非常に遅いです。ファイルをアップロードする前に無駄なゼロを削除する方が効率的です。すべてのゼロを削除すると、線はすべてゼロからゼロまでの実線の代わりにピークからピークまでピークを示し、ゼロより大きい次の値までのスペースが続きます。は、このような内容をCSVファイル考える

ご覧のとおり、データのリストには3つのグループがあります。 GRP1のような行が3つある場合は、そのリストの中の2番目の0を削除したいと思います。実際には、これは0より大きい値に対しても機能します... 10秒ごとに同じ値が10秒ごとに検出された場合は、両端を残して2から9の項目を削除すると良いでしょう。

折れ線グラフは同じように見えますが、データは処理するにははるかに小さくなります。理想的には、入力ファイルを読み込む前にディスク上のシェルスクリプトを使ってこれを行うことができます。

ので(ただ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 

それとも...別の期待される結果を今回は0を使用します... GRP2の一般的な連続値として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: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 

このスクリプトを実行すると、 LL無用0の値...とだけ残して:

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の答えは私が近づくが、それでも1つの一意のグループには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 

ではなく、これに取得する素晴らしい次のようになります。

+1

少なくとも、期待される出力を示します – RomanPerekhrest

+0

指定された入力に期待される出力を追加してください。 –

答えて

0

$ 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 

基本的には(存在する場合)最初と最後を保ち発生3番目、4番目、6番目のフィールドのそれぞれのユニークな組み合わせの

編集:ワード連続の新たな光で、どのようにこのひどいハックについて:第二データの

$ 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,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

私は同意する、それは最も明白な質問ではない。申し訳ありません。あなたの答えは、ファイル全体のグループごとに一意の値の最初と最後の値が印象的です。ここでは、値を変更する前に連続する同じ値のセクションのみにトリックを適用します。それで部分的に私をそこに連れて来るかもしれない。 – CJoe

+0

私の編集をご覧ください。 –

+0

最初に一意のグループ(3のうちの1つ)のファイルを作成してawkを適用すると、うまくいくようです。ありがとう。まだ検証中です。 – CJoe

0

シンプル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を持っていない行のみ考慮します

+0

答えに感謝しますが、それは私の例の "役に立たない"ものだけでなく、すべてのゼロを取り除きます。私はいくつかを保持したい。特に同じ値の多くの連続する終点であるので、彼らはまだ0から0としてグラフ化/グラフ化されます...与えられたGRPの両端に0をすべて必要とせずに。 – CJoe

+1

@CJoe、いくつかの*を保持することは何を意味しますか? – RomanPerekhrest

0

レスキューに!

1悪い置か質問ですが、あなたは気にしないならば、私は、タイトルで亀裂を取るよ
$ 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 
+0

お返事ありがとうございますが、私は反復を排除しているとは思わないし、結果のファイルは私が最初に始めるファイルよりも大きくなります。 – CJoe

+0

入力したサンプル入力でスクリプトを試しましたか? – karakfa

+0

最初にGRPを取得して1つのGRPを取得した場合、awkを適用しても問題ありません。たとえば、ここのサンプルファイルの00:06:01から00:15:11までは、すべてGRP1の値1です。まだ20行あります。最初と最後...価値の変更に先立って2つしかないのはいいですね。 – CJoe

関連する問題