field1が一致し、field3の日付/時刻が最初のfield1一致から5分以内の場合は、CSVファイルをフィルタリングして削除します。

field1が一致し、field3の日付/時刻が最初のfield1一致から5分以内の場合は、CSVファイルをフィルタリングして削除します。

Raspberry PiのUbuntuでシェルスクリプトを使用してbash(カンマ区切りの)CSVリストから行を削除しようとしています。ゲーム1そして3次戦は1次戦の初戦から5分(300秒)も残っていませんでした。}。

これはサンプル入力ファイルです。行が保持または削除される理由を説明するために、目的の出力に#を使用してコメントを付けました。私が望むのはコメントではなく、「削除」という行だけです。実際の入力ファイルとフィルタリングされた出力ファイルは次のとおりです。

A11EEA,@N171WT,2021/03/06 12:37:25,700,0.1
A0FC0A,@N1624K,2021/03/06 13:37:33,1975,2.0
...et cetera

注釈付きの目的の出力を持つ入力ファイル:

A11EEA,@N171WT,2021/03/06 12:37:25,700,0.1     # Keep - 1st occurrence of Field-1
A0FC0A,@N1624K,2021/03/06 13:37:33,1975,2.2    # Keep - 1st occurrence of Field-1
AB8C37,@AAL2386,2021/03/06 13:45:43,4500,1.3   # Keep - 1st occurrence of Field-1
A55325,@N442MG,2021/03/06 15:28:06,600,0.4     # Keep - 1st occurrence of Field-1
AB8C37,@AAL2386,2021/03/06 13:50:46,4500,1.5   # Keep - more than 5 mins from line 3
AB0ED6,@UAL1470,2021/03/06 13:51:23,4925,1.6   # Keep - 1st occurrence of Field-1
AB8C37,@AAL2386,2021/03/06 13:52:48,4500,1.7   # Delete - less than than 5 mins from line 5
AB0ED6,@UAL1470,2021/03/06 13:56:30,4925,1.8   # Keep - more than 5 mins from line 6
AB0ED6,@UAL1470,2021/03/06 13:56:40,4925,1.9   # Delete - less than than 5 mins from line 8
AB8C37,@AAL2386,2021/03/06 13:56:49,4500,1.0   # Delete - less than than 5 mins from line 5**

** Line 7 of the original record is not considered because it is slated for deletion

理想的には、次のことを繰り返し実行するのではなく、awk/sed/sort/uniqを使用するソリューションが必要です。

while IFS= read -r line
do
   IFS=, read -ra record <<< "$line"
   # ... do a bunch of stuff
done < "inputfile.csv"

これを試しましたが、awk作業の複雑さと潜在的な繰り返しのためにすぐに詰まっていました。

助ける?美しいですか?

答え1

2つの日付間の秒単位の差を求める関数を作成し、最初のフィールドでインデックス付けされた配列に最後のawkawk有効な」日付を保存して比較に使用できます。たとえば、次のようになります。

awk '
function getDateDifference(a,b) {
    gsub(/[:/]/, " ", a)
    startDate = mktime(a)
    gsub(/[:/]/, " ", b)
    endDate = mktime(b)
    return int(endDate - startDate)   
}

BEGIN { FS=OFS="," } 

dates[$1]=="" || (dates[$1]!="" && getDateDifference(dates [$1],$3) > 300){
    print $0;
    dates[$1] = $3
}' input.txt

日付を比較する前に、特定の最初のフィールドにインデックス付き配列値が存在することを確認して、最初の一致が印刷されていることを確認する必要があります。

関連情報