如果第一个单元格中的值满足条件,如何从CSV中删除一行?

时间:2019-02-05 17:15:22

标签: linux bash csv

我有一个包含时间和任务的CSV文件:

0800,take out trash
1000,read a book
1230,have lunch
1300,buy groceries
1600,meet with friends
2000,go to sleep

我想创建一个脚本,该脚本在运行时将当前时间与第一个字段中的时间进行比较。如果现在的时间大于该字段,则应删除该行。

我不知道从哪里开始,我也不是一个程序员。

4 个答案:

答案 0 :(得分:0)

使用GNU awk和strftime

$ awk -F, 'strftime("%H%M")<$1' file
2359,hack the planet

答案 1 :(得分:0)

这可以完成工作

#!/usr/bin/env bash

date=$(date +%H%M)

while read line; do
    if [ $(echo $line | cut -d ',' -f1) -gt $date ]; then
        echo $line
    fi
done < $1

测试:

$ cat foo 
10,a
20,b
2010,b
2020,b
2110,b
$ date
Di  5 Feb 2019 20:18:46 CET
$ ./script.sh foo 
2020,b
2110,b

但是您必须稍微改善bashscript,使其更加坚固!我的代码是“概念证明”

答案 2 :(得分:0)

在与date比较并使用默认操作之前,使用$1设置变量的混合会有轻微变化:

awk -F, -v t=$(date '+%H%M') '$1 > t' file

示例

$ echo $(date '+%H%M')
1341

$ awk -F, -v t=$(date '+%H%M') '$1 > t' file
1600,meet with friends
2000,go to sleep

答案 3 :(得分:-1)

除此以外,明显的缺陷(没有日期成分)和天真的CVS(无引号的字符串)应该很简单:

我稍微修改了您的文件(由于当前时间):

$ cat time.csv 
0400,take out trash
0600,take out trash
0800,take out trash
1000,read a book
1230,have lunch
1300,buy groceries
1600,meet with friends
2000,go to sleep

我当前的时间:

06:36:49

大量运行:

awk 'BEGIN{ "date \"+%H%M\""|getline time} $1>time' time.csv 
0800,take out trash
1000,read a book
1230,have lunch
1300,buy groceries
1600,meet with friends
2000,go to sleep

您只需要捕获输出并替换文件即可。

awk 'BEGIN{ "date \"+%H%M\""|getline time} $1>time' time.csv  > time.new && mv time.new time.csv