刪除特定行

刪除特定行

我想從 csv 檔案中刪除幾行。

規則很簡單(如果符合則保持線路):

  • 這是文件中的第一行。
  • 第一個值與上一行的第一個值不同。
  • 第二個值比前一個保留行增加了至少 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,當前行的第一個字段等於上一行的第一個字段,或者當前行的第二個字段大於或等於上一行的第二個字段,則打印當前行並賦值給當前行的值第二個欄位到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.pyexample 的檔案中。
使用 使其可執行chmod +x csvfilter.py

然後,您可以使用要處理的 csv 檔案從命令列運行它(我將問題中的範例儲存為source.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

相關內容