Сценарий оболочки для сортировки по столбцу даты с помощью команды Linux «sort»

Каким-то образом ваш / var / lib / dpkg / status был поврежден.

Вы могли

  1. Попытаться отредактировать файл и исправить его вручную.

  2. Попробуйте это решение из http://www.debianhelp.co.uk/debianproblem.htm

Восстановить данные выбора пакета

Если / var / lib / dpkg / status становится неработоспособным по любой причине, система Debian теряет данные о выборе пакета и сильно страдает. Найдите старый файл / var / lib / dpkg / status по адресу / var / lib / dpkg / status-old или / var / backups / dpkg .status. * .

Хранение / var / backups / в отдельном разделе может быть хорошей идеей, поскольку этот каталог содержит множество важных системных данных.

Если старый файл / var / lib / dpkg / status недоступен, вы все равно можете восстановить информацию из каталогов в / usr / share / doc / .

 # ls / usr / share / doc | \ 
grep -v [A – Z] | \ 
grep -v '^ texmf $' | \ 
grep -v '^ debian $' | \ 
awk '{print $ 1 "install"}' | \ 
dpkg --set-selections 
 
 # dselect --expert # переустановите систему, при необходимости отмените выбор 
 

0
16.06.2018, 14:00
1 ответ
$ 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 awklee los datos ordenados e imprime la primera entrada encontrada para cada usuario. La variable seenes 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 awkanterior.

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 awkrealice 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.

4
28.01.2020, 02:23

Теги

Похожие вопросы