特定の行を削除する

特定の行を削除する

csv ファイルから数行を削除したいと思います。

ルールは非常に簡単です (次の場合はラインを維持します):

  • ファイルの最初の行です。
  • 最初の値は前の行の最初の値と異なります。
  • 2 番目の値は、前の保持された行から少なくとも 10 増加しました。

ソース

Test1,  0.0, 1
Test1,  0.2, 1
Test1, 10.0, 3
Test2,  0.1, 1
Test2,  0.3, 3
Test2,  1.0, 5
Test2, 11.0, 7

結果

Test1,  0.0, 1
Test1, 10.0, 3
Test2,  0.1, 1
Test2, 11.0, 7

私はこれを awk といくつかの if ステートメントで実行しようと考えていましたが、レコード処理間で転送される変数を作成できるかどうかはわかりません。


編集: これはコメント セクションに隠されていました (私から):

変数はレコード間で使用できることがわかりました。C のようには機能しません。誰かが他の人にも使えると思われる回答をするか、私に回答を求める人がいない限り、この質問を削除します。

答え1

awkのタグが付いているので

awk -F", *" 'x!=$1||$2>=y+10{y=$2;print}{x=$1}' file


Test1,  0.0, 1
Test1, 10.0, 3
Test2,  0.1, 1
Test2, 11.0, 7

答え2

Perl の使用:

perl -lane 'if($.==1||"$F[0]"ne"$F0"||$F[1]>=$F1+10){print;$F1=@F[1]}$F0=@F[0]' file

拡張:

if($. == 1 || "$F[0]" ne "$F0" || $F[1] >= $F1 + 10){
    print;
    $F1 = @F[1]
}
$F0 = @F[0]
  • if($.==1||"$F[0]"ne"$F0"||$F[1]>=$F1+10){print;$F1=@F[1]}: 現在の行の番号が1、現在の行の最初のフィールドが前の行の最初のフィールドと等しい、または現在の行の 2 番目のフィールドが前の行の 2 番目のフィールドより大きいか等しい場合は、現在の行を出力し、現在の行の 2 番目のフィールドの値を に代入しますF1
  • $F0=@F[0]: 現在の行の最初のフィールドの値をF0;に割り当てます。
% cat file
Test1,  0.0, 1
Test1,  0.2, 1
Test1, 10.0, 3
Test2,  0.1, 1
Test2,  0.3, 3
Test2,  1.0, 5
Test2, 11.0, 7
% perl -lane 'if($.==1||"$F[0]"ne"$F0"||$F[1]>=$F1+10){print;$F1=@F[1]}$F0=@F[0]' file
Test1,  0.0, 1
Test1, 10.0, 3
Test2,  0.1, 1
Test2, 11.0, 7

答え3

Python スクリプトの使用:

#! /usr/bin/env python3
import sys
with open (sys.argv[1]) as f:
  rows=[list(map(str.strip, line.split(','))) for line in f.readlines()]
  result=rows[0:1]
  for r in rows:
    if r[0] != result[-1][0] or float(r[1]) >= float(result[-1][1])+10:
      result.append(r)
  print("\n".join([",".join(res) for res in result]))

csvfilter.py上記のスクリプトをコピーし、たとえばというファイルに貼り付けます。
を使用して実行可能にしますchmod +x csvfilter.py

source.csv次に、処理する csv ファイル (質問の例を として保存しました) を引数としてコマンドラインから実行できます。

$ ./csvfilter.py source.csv 
Test1,0.0,1
Test1,10.0,3
Test2,0.1,1
Test2,11.0,7

スクリプトは元のファイルを変更せず、新しいバージョンを標準出力に出力するだけです。また、スペースを使用した以前の書式設定は破棄されます。

元のファイルを変更されたバージョンに置き換えるには、出力を元のファイルにリダイレクトします。

$ ./csvfilter.py source.csv > source.csv

変更したバージョンをファイルとして保存することもできます。

$ ./csvfilter.py source.csv > modified.csv

関連情報