![グループ化と並べ替え | ユーザーの最終ログイン時間](https://rvso.com/image/154476/%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97%E5%8C%96%E3%81%A8%E4%B8%A6%E3%81%B9%E6%9B%BF%E3%81%88%20%7C%20%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%81%AE%E6%9C%80%E7%B5%82%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E6%99%82%E9%96%93%20.png)
ユーザーのログイン日付の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