グループ化と並べ替え | ユーザーの最終ログイン時間

グループ化と並べ替え | ユーザーの最終ログイン時間

ユーザーのログイン日付のcsvファイルがあります

user1,2019-05-21
user1,2019-05-22
user1,2019-05-23
user2,2019-05-20
user2,2019-05-21
user3,2019-05-24
user3,2019-05-29
user4,2019-05-25
user4,2019-05-28

以下の形式で必要です。

user1,2019-05-23
user2,2019-05-21
user3,2019-05-29
user4,2019-05-28

私は試したawk -F, '!a[$1]++'最後の値ではなく、最初の値が返されます。

答え1

$ sort -t, -k1,1 -k2,2r file | sort -t, -u -k1,1
user1,2019-05-23
user2,2019-05-21
user3,2019-05-29
user4,2019-05-28

最初のステップでは、sortデータをユーザーと日付の逆順に並べ替えます。このステップの出力は次のようになります。

user1,2019-05-23
user1,2019-05-22
user1,2019-05-21
user2,2019-05-21
user2,2019-05-20
user3,2019-05-29
user3,2019-05-24
user4,2019-05-28
user4,2019-05-25

2 番目はsort、ユーザーのみでソートし、各ユーザーの行のインスタンスを 1 つだけ (最初に検出されたもの) 保持します。

答え2

コメントで指摘されているように、これは以前にも質問されており、いくつかの回答が提供されています。もう 1 つ追加したいと思います。

sort -r input.csv | awk -F, '!a[$1]++' | sort

テスト走行:

$ sort -r input.csv | awk -F, '!a[$1]++' | sort
user1,2019-05-23
user2,2019-05-21
user3,2019-05-29
user4,2019-05-28

説明:

最初の列の最初の出現を印刷する方法はすでにご存知でしょう。最後の列が必要な場合、これ以上頭を悩ませる必要はありません。 でリストを並べ替えて反転するだけですsort -r。最後のステップとして、結果を並べ替える必要がある場合にのみ、 に再度パイプしますsort


パイプなし:

これを 1 つのコマンドで解決することもできます。入力ファイルがソートされている場合 (例のように):

awk -F, '{a[$1]=$2}END{for(k in a){print k","a[k]}}' input.csv

さもないと:

awk -F, '$2>a[$1]{a[$1]=$2}END{for(k in a){print k" "a[k]}}' input.csv

関連情報