【问题标题】:linux trouble with removing lines but not that simplelinux删除线的麻烦,但不是那么简单
【发布时间】:2020-03-02 20:38:42
【问题描述】:

我在删除文件中的某些特定行时遇到了麻烦,但这并不是那么简单。问题要求搜索然后保存特定日期和时间的行,例如2008-06-0812:40:53.90 AM,直到用户想要的日期,这是一个读取变量输入$dayy。真正的问题是我想要在12:40:53 之后更大的行,直到如果$dayy 是例如2008-06-12 我需要在特定时间12:40:53.90 之前存在的行,恰好在4 天之后。我使用了下面的 bash 代码和最后一个 awk 命令,我想删除那天 ($dayy) 的行,它们的时间在 12:40:53.90 之后,但它删除了该日期的所有行。如果您能帮上忙,我将不胜感激。

例如,如果第一天是 2008-06-08 (spec_date) 和时间 12:40:53.90 (timee) 那么我想要从那天开始的所有行,直到两天后的同一时间 2008-06-10 ( dayy)

read dayy ;  read spec_date ; read timee ;

awk -v dayy $dayy -v spec_date=$spec_date -v timee=$timee '{ if($1 >=spec_date && $2>=timee  && $1 <= dayy) print $0}' ex1.dat > ex2.dat

awk -v dayy=$dayy '! ( $1==dayy  &&   $2 ="[12-23]:[0-59]:[0-59].[0-50]")' ex2.dat

我的数据示例

2008-06-08  12:40:53.90  
2008-06-08  12:43:39.80 
.......................
2008-06-11  **12:39:34.22**
2008-06-11    13:21:23:43

【问题讨论】:

  • 用于匹配正则表达式的awk 运算符是~,而不是=。而[0-59] 不是您匹配范围内数字的方式。
  • 请参阅stackoverflow.com/questions/22130429/…,了解如何为数字范围编写正则表达式。

标签: linux awk time


【解决方案1】:

你需要匹配3种情况:

  1. 第一天:day == spec_date,比赛时间 >= timee
  2. 最后一天:day == dayy,比赛时间
  3. 介于:spec_date 和 dayy 之间的日期,匹配所有内容

所以写下每个条件并将它们与||结合起来。

awk -v dayy=$dayy -v spec_date=$spec_date -v timee=$timee '
    ($1 == spec_date && $2 >= timee) || 
    ($1 == dayy && $2 <= timee) || 
    ($1 > spec_date && $1 < dayy)' ex1.dat

【讨论】:

    猜你喜欢
    • 2011-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-24
    • 2017-01-30
    • 2023-03-13
    • 2012-10-07
    • 1970-01-01
    相关资源
    最近更新 更多