ソートせずに、特定の列に基づいてテキストファイル内の一意のデータをフィルタリングします。

ソートせずに、特定の列に基づいてテキストファイル内の一意のデータをフィルタリングします。

次の形式の10-100k行のさまざまなテキストファイルがあります。

"2018-12-07 23:21:32",XX,99,ZZZ,250,REMOVED
"2018-12-07 23:25:17",XX,99,ZZZ,250,AVAILBLE
"2018-12-07 23:29:05",DD,11,AAA,250,REMOVED
"2018-12-07 23:30:00",CH,00,UUU,250,REMOVED
"2018-12-07 23:31:45",MM,33,OOO,250,REMOVED
"2018-12-07 23:46:41",XX,99,ZZZ,250,REMOVED

上記の例では、列2、3、4が同じ3つのレコード(XX、99、ZZZ - 行1/2/6)があることがわかります。最初の2行を削除し、最後の行のみを保持する必要があります。

希望の出力は以下の通りです。

"2018-12-07 23:29:05",DD,11,AAA,250,REMOVED
"2018-12-07 23:30:00",CH,00,UUU,250,REMOVED
"2018-12-07 23:31:45",MM,33,OOO,250,REMOVED
"2018-12-07 23:46:41",XX,99,ZZZ,250,REMOVED

非常に遅く、100k〜ラインのファイルに対してメモリエラーを発生させるPHPスクリプトがあります。

ベストアンサー1

最後の項目だけを残してすべてを削除するよりも、一連の重複項目のうち最初の項目だけを残してすべてを削除する方が簡単です。次のように試すことができます。

$ tac file | awk -F, '!seen[$2 FS $3 FS $4]++' | tac
"2018-12-07 23:29:05",DD,11,AAA,250,REMOVED
"2018-12-07 23:30:00",CH,00,UUU,250,REMOVED
"2018-12-07 23:31:45",MM,33,OOO,250,REMOVED
"2018-12-07 23:46:41",XX,99,ZZZ,250,REMOVED

おすすめ記事