web-dev-qa-db-ja.com

awk、uniq、sortを使用して列の最大値を持つ行を取得します

次の形式のファイルがあります

2011-12-01 user1 access1
2011-12-01 user1 access2
2011-12-01 user2 access2
2011-12-01 user4 access2
2011-12-02 user1 access1
2012-01-01 user3 access1
2012-01-01 user4 access2

すべてのユーザーに対して最終日を表示する出力が欲しいので、

2011-12-02 user1 access1
2011-12-01 user1 access2
2011-12-01 user2 access2
2012-01-01 user3 access1
2012-01-01 user4 access2

私はこのようなものを試しました:

less myfile.txt | sort -k1r | uniq -f 1  | sort -b -k1

しかし、それは正しく機能していないようです。

ご協力ありがとう御座います!

6
gakhov

私はあなたが欲しいと思います

cat myfile.txt| sort -k1 -r | sort --unique --stable -k2,3

(上記のcatに関する私のコメントを参照してください)。最初の並べ替えでは、最新の日付が一番上に表示されます。 2番目の並べ替えでは、ユーザー+アクセスで並べ替えますが、--stableを指定すると、同じユーザー+アクセスの組み合わせを持つ行の以前の順序が維持されます。つまり、最新のものが一番上に表示されます。 --uniqueを指定すると、ユーザーとアクセスの組み合わせが等しい実行の最初の行のみが表示されます。 (それを| uniq -f1に置き換えることができます、もしそれがたまたまGNUあなたのソートが持っていない拡張子であるなら。)

6
Ulrich Schwarz

もうすぐです。sortオプションを調整する必要があります。

sort -k2,2 -k1,1r myfile.txt | uniq -f1

つまり、ユーザーで並べ替えて日付を逆にし、ユーザーとアクセスの最初の出現のみを残します。

6
angus

awkを1回呼び出すだけで実行したい場合

awk '($1 > a[$2,$3]){a[$2,$3]=$1}END{for(x in a){split(x,b,SUBSEP);print a[x],b[1],b[2]}}' in
4
SiegeX