
ユーザーのログイン日付の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