删除文件中日期早于x的行

时间:2019-06-04 06:38:35

标签: bash shell while-loop stream

我可以像这样将整个文件读入内存:

#!/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,然后转到该行。

2 个答案:

答案 0 :(得分:1)

仅在文件排序后才能使用二进制搜索。

您不需要将整个文件读入内存;您可以逐行处理它:

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

而且:是的,我个人不会使用shell脚本来解决这类问题,但这当然是有品味的。

答案 1 :(得分:1)

您没有显示输入文件的外观,而是通过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)