удалите строки, который является более новым, чем данная дата в файле

Я смог уменьшить rootfs онлайн на ReiserFS v3 с помощью resize_reiserfs для тестирования. Это было несколько лет назад на некотором Linux. Но теперь я добираюсь, "Не может уменьшить файловую систему онлайн".. Я услышал, ext3 был стягиваемый онлайн в некоторых случаях с resize2fs, и это не было в других случаях. Я живо, эта функция очень опасна и нестабильна, и может "случайно целый FS".

8
05.06.2014, 14:10
4 ответа

Если ваша система включает GNU-версию команды date , вы можете использовать ее для преобразования поля даты (после удаления конечный
, если есть) до секунд с начала эпохи и сравнивать непосредственно с датой отсечения в том же формате, например в bash

testsecs=$(date +%s --date="2013/12/03")
while IFS= read -r line; do
  read -r x d <<< "$line" 
  if (( $(date +%s --date="${d%<br>}") < $testsecs )); then
    printf '%s\n' "$line"
  fi
done < buildsave.txt

[Обратите внимание, что это не выполняет удаление на месте - вам необходимо сохранить результаты во временный файл и переименовать.]

4
27.01.2020, 20:10

Быстрое и грязное решение для одной даты, которую вы указали, просто удалите все строки с помощью sed, которые соответствуют датам позже этой даты:

sed -i "" "#[0-9]* 2013/12/0[4-9]#d" testfile.txt
sed -i "" "#[0-9]* 2013/12/[123][0-9]#d" testfile.txt
sed -i "" "#[0-9]* 2014/[0-9][0-9]/[0-3][0-9]#d" testfile.txt

-i "" заменяет непосредственно внутри файла и не создает резервную копию, но вы также можете пропустить тестовый файл через все 3 команды sed без -i "".

В зависимости от вашей системы (linux или mac) вы можете опустить "" после -i, а иногда вам нужен параметр -e для регулярных выражений. Надо попробовать то, что работает для вас.

Связанный вопрос с дополнительной информацией о sed: https://stackoverflow.com/questions/5410757/

-1
27.01.2020, 20:10

Эти даты лексикографически и хронологически сортируются одинаково, так что это всего лишь вопрос лексического сравнения:

awk '$2 < "2013/12/03"'
9
27.01.2020, 20:10

Я полагаю, что
в вашем вопросе в конце столбца дата является чем-то нежелательным. В любом случае его легко удалить, если он присутствует. Однако, переходя к основной части, вы можете добиться того, что вы пытаетесь сделать, используя

sort -k 2n filename.txt

. Теперь приведенная выше команда выдаст вывод в отсортированном виде. Теперь приведенная ниже команда должна дать то, что вы ищете.

sort -k 2n filename.txt | awk '/2013\/12\/03/ {exit} {print}' 

Пояснение

Команда sort в основном сортирует файл на основе второго столбца, который является датой. Поэтому я изменил ваш входной файл, чтобы проверить, работает ли команда, поскольку во входном файле все данные по умолчанию отсортированы. После этого команда awk печатает все строки, пока мы не встретим конкретное совпадение.

Тестирование

cat filename.txt

647919 2014/01/01
647946 2012/11/30
647955 2011/01/04
648266 2013/12/03
648267 2013/12/03
648674 2013/12/04

Теперь sort -k 2n filename.txt вывод:

647955 2011/01/04
647946 2012/11/30
648266 2013/12/03
648267 2013/12/03
648674 2013/12/04
647919 2014/01/01

Теперь мы удовлетворены тем, что файл отсортирован по второму столбцу. Теперь, чтобы выбрать значения ДО определенной даты,

sort -k 2n filename.txt | awk '/2013\/12\/03/ {exit} {print}' 

В приведенном выше примере я получаю все значения до 2013/12/03 . Вывод такой:

647955 2011/01/04
647946 2012/11/30

Нет,
является частью моего файла

Если это так, мы можем немного изменить команду, как показано ниже.

awk '{print $1, substr($2, 1, length($2)-4)}' filename.txt | 
sort -k 2n filename.txt | awk '/2013\/12\/03/ {exit} {print}' 

Я просто удаляю все теги
из второго столбца, а затем передаю вышеупомянутую команду по конвейеру.

Ссылки

https://unix.stackexchange.com/a/11323/47538

https: //unix.stackexchange.com / a / 83069/47538

2
27.01.2020, 20:10

Теги

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