
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