グループ化とソートユーザーの最後のログイン時間

グループ化とソートユーザーの最後のログイン時間

ユーザーのログイン日を記録する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

1つ目は、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

コメントで指摘したように、この質問は以前に要求され、いくつかの答えが提供されました。私も以下を追加したいと思います:

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を使用してリストを逆にするだけですsort -r。最後のステップでsort結果をソートする必要がある場合にのみ。


パイプなし:

単一のコマンドを使用してこの問題を解決することもできます。入力ファイルがソートされている場合(あなたの例のように):

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

関連情報