【问题标题】:Delete lines up to regexp with sed or awk使用 sed 或 awk 删除直到正则表达式的行
【发布时间】:2018-08-22 04:59:33
【问题描述】:

我想使用 sed 或 gawk/awk 命令来查找正则表达式:

TRAFFIC

并将其与以下 unix 命令或类似命令结合使用,使 sysdate 减去一天:

date "--date=${dataset_date} -${date_diff} 1 day" +%d%b%Y

然后删除 regexp 和 sysdate 之间的所有行减去一天。

文件输入示例:

TYPE = REGIONAL                              (keep)
TRAFFIC AND LOGISTICS                        (keep)
                                             (delete)
DATE                                         (delete)
01AUG18                                      (delete)
TIME          TRA            NDFV            (delete)
00:00-00:15    0.00           0              (delete)
00:15-00:30    0.00           0              (delete)
00:30-00:45    0.00           1              (delete)
DATE                                         (delete)
02AUG18                                      (keep - sysdate minus one day)
TIME          TRA            NDFV            (keep)
00:00-00:15    0.00           2              (keep)
00:15-00:30    0.00           0              (keep)
00:30-00:45    0.00           0              (keep)
00:45-01:00    0.00           0              (keep)

文件输出示例:

TYPE = REGIONAL
TRAFFIC AND LOGISTICS
02AUG18    
TIME          TRA            NDFV 
00:00-00:15    0.00           2   
00:15-00:30    0.00           0   
00:30-00:45    0.00           0   
00:45-01:00    0.00           0  

在这种情况下,02AUG18 将是 sysdate 减去一天。通常在正则表达式和 sysdate 之间会有更多的行要删除。是否可以组合如下命令:

sed '/TRAFFIC/,/ [sysdate minus one day] /d'

【问题讨论】:

    标签: awk sed


    【解决方案1】:

    试试 awk:

    d=$( date -d yesterday "+%d%b%y" | tr '[:lower:]' '[:upper:]' )
    awk -v date="$d" '$1 == date {del = 0}; !del; /TRAFFIC/ {del = 1}'
    

    【讨论】:

    • 看起来d= 行是为变量命名,所以我尝试在 awk 行上为我的输入和输出文件添加t1>t2,但它删除了 TRAFFIC 之后的所有内容。请问还有其他建议吗?
    • 如果今天是 8 月 3 日,这将适用于您的示例文本。但现在不是 8 月 3 日
    • 我尝试使用从别人那里得到的sed 命令,但我仍然无法让它工作,所以看起来awk 是本周的赢家。
    【解决方案2】:

    打印前两行,然后打印从 sysdate -1 到另一个 DATE 的范围:

    sed -n -e '1,2p' -e "/$(date -v-1d  +%d%b%y | tr -s '[:lower:]' '[:upper:]')/,/DATE/p"
    

    输出:

    TYPE = REGIONAL                              (keep)
    TRAFFIC AND LOGISTICS                        (keep)
    20AUG18                                      (keep - sysdate minus one day)
    TIME          TRA            NDFV            (keep)
    00:00-00:15    0.00           2              (keep)
    00:15-00:30    0.00           0              (keep)
    00:30-00:45    0.00           0              (keep)
    00:45-01:00    0.00           0              (keep)
    

    重点是,是的,您可以将表达式传递给 sed;在这种情况下,作为范围的一部分。注意:(1)我假设可能有另一个 DATE 超过第二个,因此用 DATE 关闭了范围,但您可能想要别的东西。

    【讨论】:

    • -v 约会?那是 BSD/OSX 吗?
    • @glennjackman 是的。根据 val 调整秒、分、时、月、日、星期、月或年。
    猜你喜欢
    • 1970-01-01
    • 2013-12-01
    • 1970-01-01
    • 2012-06-01
    • 1970-01-01
    • 2019-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多