Я застрял на том, как я могу удалить строки, которые новее, чем заданная дата. Вот фрагмент содержимого файла.
buildsave.txt
647919 2013/11/30
647946 2013/11/30
647955 2013/12/01
648266 2013/12/03
648267 2013/12/03
648674 2013/12/04
Я хотел бы удалить строки, которые новее, чем 2013/12/03, оставив только
647919 2013/11/30
647946 2013/11/30
647955 2013/12/01
Как это можно сделать через bash?
bash
text-processing
Джейсон Дж
источник
источник
Эти даты сортируются по лексикографически и хронологически одинаково, так что это всего лишь вопрос лексического сравнения:
источник
Я предполагаю, что
<br>
в вашем вопросе в концеdate
столбца есть что-то нежелательное. В любом случае, он может быть легко удален, если он присутствует. Однако, перейдя к основной части, вы можете достичь того, что вы пытаетесь сделать, используяТеперь приведенная выше команда выдаст выходные данные отсортированным образом. Теперь приведенная ниже команда должна дать то, что вы ищете.
объяснение
Команда sort в основном сортирует файл по второму столбцу, который является датой. Поэтому я изменил ваш входной файл, чтобы проверить, работает ли команда, поскольку во входном файле все данные отсортированы по умолчанию. После этого
awk
команда печатает все строки, пока мы не встретим конкретное совпадение.тестирование
Теперь
sort -k 2n filename.txt
выводТеперь мы удовлетворены тем, что файл отсортирован по второму столбцу. Теперь, чтобы выбрать значения UPTO определенной даты,
В приведенном выше примере я получаю все значения до
2013/12/03
. Выход есть,Нет,
<br>
это часть моего файлаЕсли это так, мы можем немного изменить команду, как показано ниже.
Поэтому я просто удаляю все
<br>
теги из второго столбца, а затем добавляю вышеупомянутую команду.Ссылки
https://unix.stackexchange.com/a/11323/47538
https://unix.stackexchange.com/a/83069/47538
источник
Быстрое и грязное решение для одной даты, которую вы дали, просто удалите все строки с помощью sed, которые соответствуют датам позже этой даты:
-I "" заменяет непосредственно внутри файла и не создает резервную копию, но вы также можете передать тестовый файл через все 3 команды sed без -i "".
В зависимости от вашей системы (Linux или Mac) вы можете пропустить "" после -i, а иногда вам потребуется параметр -e для регулярных выражений. Должен попробовать то, что работает для вас.
Связанный вопрос с дополнительной информацией о sed: /programming/5410757/
источник
#
это комментарий команда вsed
, так что те не будут ничего делать. Используйте,sed '\#patter#d'
если вы хотите другой разделитель RE, чем/
.[0-9]*
Часть избыточна без^
якоря. нужен-e
только тогда, когда вы хотите передать несколько выражений. linux - это ядро, mac - это компьютерный бренд, и ни один из них не имеет к этому никакого отношения . Различия между GNU и FreeBSD (которые OS / X (как встречается на некоторых маках) унаследованы).sed
sed
sed