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