$ sort -k 3,3r session.log | awk '!seen[$2]++ { print }'
9 u1 2018-08-12 pass
6 u4 2018-07-11 pass
2 u2 2018-06-15 pass
3 u3 2018-05-18 pass
(El { print }
se puede eliminar por completo, solo lo incluyo para mostrar lo que sucede. La acción predeterminada es imprimir todo el registro de entrada si la condición es verdadera.)
Esto ordena el archivo que tiene, por fechas decrecientes (la fecha más reciente primero ). El programa awk
lee los datos ordenados e imprime la primera entrada encontrada para cada usuario. La variable seen
es una matriz/hash asociativo que utiliza los nombres de usuario como claves. Si su valor es cero para un usuario, entonces ese usuario aún no ha sido visto, por lo que se imprime la línea del archivo.
Tu código con mis anotaciones:
# get list of unique usernames from log:
( awk {print} session.log | cut -f2 -d' ' | sort | uniq ) > store.txt
# shorter equivalent:
# cut -d ' ' -f2 <session.log | sort -u >store.txt
# loop over the usernames:
for line in $(cat "store.txt")
do
# get entries related to this user:
grep "$line" session.log > "$line.txt"
# echo the last entry:
echo $(sort -k3 "$line.txt" | awk 'END{print}')
# shorter equivalent of both of the above commands:
# awk -v user="$line" '$2 == user { print }' session.log | sort -k3,3 | tail -n 1
done
rm -f store.txt
Entonces, un enfoque alternativo basado en su ciclo de shell:
cut -d ' ' -f2 <session.log | sort -u |
while read username; do
awk -v user="$username" '$2 == user { print }' session.log | sort -k 3,3 | tail -n 1
done
Nuevamente, el { print }
puede quedar fuera del script awk
anterior.
Esto todavía ordena los subconjuntos del registro de sesión una vez para cada usuario, lo que es un desperdicio.
Pre -ordenar el registro por fechas decrecientes:
sort -k3,3r -o sorted.log session.log
cut -d ' ' -f2 <session.log | sort -u |
while read username; do
awk -v user="$username" '$2 == user { print; exit }' sorted.log
done
rm sorted.log
Esto todavía requiere que escaneemos el registro desde arriba una vez por usuario. La mejora natural es permitir que awk
realice un seguimiento de qué usuarios se han visto y qué usuarios no se han visto, lo que le da mi respuesta en la parte superior.
Для этого можно установить wmctrl
с помощью следующей команды:
bash -c 'wmctrl -a file1.txt || leafpad ~/file1.txt'
Опция -a
переключает на окно с заголовком, содержащим file1.txt
. Однако, если команда не удалась, то есть ||
, она откроет ваш файл.