Удалить строки в файле с датой старше x - PullRequest
0 голосов
/ 04 июня 2019

Я могу прочитать весь файл в память следующим образом:

#!/bin/bash

filename='peptides.txt'
filelines=`cat $filename`

ten_days_ago="$(date)"

for line in $filelines ; do
    date_of="$(echo "$line" | jq -r '.time')"
    if [[ "$ten_days_ago" > "$date_of" ]]; then
       # delete this line
    fi
done

проблема в следующем:

  1. Возможно, я не хочу читать весь файл в память
  2. Если я буду транслировать его построчно с помощью bash, как я могу сохранить с какой строки удалить?Я бы удалил строки от 0 до x, где строка x имеет дату, равную 10 дням назад.

Здесь уместен двоичный поиск - так что, возможно, bash не является хорошим решением для этого?Мне нужно найти число строк в файле, разделить на две и перейти к этой строке.

Ответы [ 2 ]

1 голос
/ 04 июня 2019

Вы не показали, как выглядит входной файл, но судя по вашему jq, его JSON-данные.

С учетом сказанного, вот как я это сделаю

today=$(date +%j)
tenDaysAgo=$(date --date="10 day ago" +%j)

#This is where you would create the data for peptides.txt
#20 spaces away there is a date stamp so it doesn't distract you
echo "Peptides stuff                    $today" >> peptides.txt

while read pepStuff; do
    if [ $pepStuff == $tenDaysAgo ]; then
        sed -i "/.*$pepStuff/d" peptides.txt
    fi
done < <(awk '{print $3}' peptides.txt)
1 голос
/ 04 июня 2019

Вы можете использовать бинарный поиск, только если файл отсортирован.

Вам не нужно читать весь файл в память;Вы можете обрабатывать его построчно:

while read line
do
   ....
done <$filename

И: Да, я лично не буду использовать сценарии оболочки для такого рода проблем, но это, конечно, дело вкуса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...