I have a file called session.log It contains some text data. 1st column contains serial number. 2nd column contains username. 3rd column contains last logged in date. 4th column contains result.
One user logged in multiple times. I need to find the last logged in date for each unique user. So I wrote a shell script. Output will display the lines with latest logged in date (3rd column) for each unique user (2nd column). Output should not contain same username multiple times.
$ cat session.log 1 u1 2018-05-19 pass 2 u2 2018-06-15 pass 3 u3 2018-05-18 pass 4 u4 2018-05-17 pass 5 u2 2018-05-14 pass 6 u4 2018-07-11 pass 7 u1 2018-05-16 pass 8 u3 2018-05-13 pass 9 u1 2018-08-12 pass 10 u1 2018-05-10 pass
What I tried:
( awk {print} session.log | cut -f2 -d' ' | sort | uniq ) > store.txt for line in $(cat "store.txt") do touch "$line.txt" grep "$line" session.log > "$line.txt" temp=$(sort -k3 "$line.txt" | awk 'END{print}') echo $temp > "$line.txt" cat "$line.txt" done
Output
$ ./sort.sh 9 u1 2018-08-12 pass 2 u2 2018-06-15 pass 3 u3 2018-05-18 pass 6 u4 2018-07-11 pass
The shell script works for the date format (yyyy-mm-dd) and (yyyy/mm/dd). Is there any better code to do the same work? Using awk
how do we do this?
EDIT:
$ cat sort.sh ( awk {print} session.log | cut -f2 -d' ' | sort | uniq ) > store.txt for line in $(cat "store.txt") do #touch "$line.txt" grep "$line" session.log > "$line.txt" echo $(sort -k3 "$line.txt" | awk 'END{print}') #temp=$(sort -k3 "$line.txt" | awk 'END{print}') #echo $temp > "$line.txt" #cat "$line.txt" done rm -f store.txt