#linux #unix #awk #sed #grep
#linux #unix #awk #sed #grep
Вопрос:
У меня есть требование, когда мне нужно перечислить файлы из каталога, который имеет уникальный шаблон, и в случае повторения выбрать тот, который обновляется последним, чтобы избежать дублирования записей.
Файлы:
File Name Update Time
Test-11121202025-20201006-111506-1601997306.txt Oct 25, 2020
Test-11121202025-20201006-111506-1801997306.txt Oct 30, 2020
Test-77722202025-20201006-111506-1601997306.txt Oct 25, 2020
Желаемый результат в этом случае:
Test-01121202025-20201006-111506-1801997306.txt
Test-77722202025-20201006-111506-1601997306.txt
Объяснение: Первый и второй файлы совпадают с моим вариантом использования, поскольку Test-11121 (начальные 10 символов) одинаковы в начальных двух файлах, однако второй обновлен совсем недавно, поэтому я отброшу первый.
в дополнение к этому, поскольку третий файл уникален, поскольку существует только одна запись с шаблоном (Test-77722), поэтому я также рассмотрю это в выходных данных.
Я попробовал команду ниже, но это не помогло. Я думаю, я могу добиться этого с помощью сценария оболочки, но хотел бы воздержаться от этого для этого небольшого варианта использования
ls -lt| awk 'BEGIN{FS="-"}{ print $2 }' | sort | uniq
Любая помощь будет высоко оценена.
Комментарии:
1. Вы говорите: «поскольку Test-11121 (начальный 10 символов) одинаков в начальных двух файлах» , но один есть
Test-11121
, а другой естьTest-01121
. Вы хотели сказать, что они одинаковы, потому что все остальные символы, кроме начальных 10, одинаковы или ваш пример плохой?2. @JNevill Извините, что я виноват. Исправлено. Спасибо за выделение
3. не уверен, почему есть голосование «против»? любое предложение по улучшению моего вопроса
4. Пожалуйста, обратите внимание: почему бы не выполнить синтаксический
ls
анализ?5. На самом деле вам не нужно «анализировать» вывод здесь — при сортировке по времени все, что вам нужно, это имя файла. «Синтаксический анализ» здесь — отвлекающий маневр.
Ответ №1:
Это работает для вас?
$ ls -l
total 0
-rw-rw-r-- 1 tink tink 0 2020-09-12 16:48 Test-11121202025-20201006-111506-1601997306.txt
-rw-rw-r-- 1 tink tink 0 2020-10-31 07:04 Test-11121202025-20201006-111506-1801997306.txt
-rw-rw-r-- 1 tink tink 0 2020-10-31 07:03 Test-77722202025-20201006-111506-1601997306.txt
И awk
на помощь:
$ ls -tr | awk '{a[substr($1,1,10)]=$0} END{for(i in a){print a[i]}}'
Test-77722202025-20201006-111506-1601997306.txt
Test-11121202025-20201006-111506-1801997306.txt
Редактировать: способ, которым это работает, заключается в том, что мы создаем массив, индексируемый первыми 10 символами каждого имени файла, содержащий целое имя файла. Поскольку файлы сортируются от самых старых к самым новым, в массиве будет только последний, соответствующий первым 10 символам. В конце мы просто перебираем массив и выводим все самые последние имена файлов.