【问题标题】:Linux script to filter lines in text file by date time pattern in the line [duplicate]Linux脚本按行中的日期时间模式过滤文本文件中的行[重复]
【发布时间】:2014-06-30 03:57:34
【问题描述】:

我不是 linux 脚本专家,我知道我可以通过一些编程来做到这一点,但我只是想通过一些命令行或简单的脚本来轻松地做到这一点。任何帮助将不胜感激。

我有一个 csv 文件,包含以下几行

Date,Time,Global_active_power,Global_reactive_power,Voltage,Global_intensity,Sub_metering_1,Sub_metering_2,Sub_metering_3

16/12/2006,18:00:00,2.79,0.18,237.52,11.8,0,0,18
16/12/2006,18:01:00,2.624,0.144,238.2,11,0,0,17
16/12/2006,18:02:00,2.772,0.118,238.28,11.6,0,0,17
16/12/2006,18:03:00,3.74,0.108,236.93,16.4,0,16,18
16/12/2006,18:04:00,4.928,0.202,235.01,21,0,37,16
16/12/2006,18:05:00,6.052,0.192,232.93,26.2,0,37,17
16/12/2006,18:06:00,6.752,0.186,232.12,29,0,36,17
16/12/2006,18:07:00,6.474,0.144,231.85,27.8,0,37,16
16/12/2006,18:08:00,6.308,0.116,232.25,27,0,36,17
16/12/2006,18:09:00,4.464,0.136,234.66,19,0,37,16
16/12/2006,18:10:00,3.396,0.148,236.2,15,0,22,18
16/12/2006,18:11:00,3.09,0.152,237.07,13.8,0,12,17
16/12/2006,18:12:00,3.73,0.144,235.78,16.4,0,27,17
16/12/2006,18:13:00,2.308,0.16,237.43,9.6,0,1,17
16/12/2006,18:14:00,2.388,0.158,237.26,10,0,1,17
16/12/2006,18:15:00,4.598,0.1,234.25,21.4,0,20,17
16/12/2006,18:16:00,4.524,0.076,234.2,19.6,0,9,17
16/12/2006,18:17:00,4.202,0.082,234.31,17.8,0,1,17
16/12/2006,18:18:00,4.472,0,233.29,19.2,0,1,16
16/12/2006,18:19:00,2.852,0,235.61,12,0,1,17
16/12/2006,18:20:00,2.928,0,235.25,12.4,0,1,17
16/12/2006,18:21:00,2.94,0,236.04,12.4,0,2,17
16/12/2006,18:22:00,2.934,0,235.51,12.4,0,1,17
16/12/2006,18:23:00,2.926,0,235.68,12.4,0,1,17
16/12/2006,18:24:00,3.452,0,235.2,15.2,0,1,17

如上所示,第二个字段是一天中的时间,具有 hh:mm:ss(精确到分钟)。显然,数据记录是每分钟在这里创建的。我想创建脚本来执行以下操作:

  1. 对于日期字段(第一个字段),给出两个日期:开始日期“SDate”和结束日期“EDate”
  2. 对于时间字段(第二个字段),给出两个小时:开始时间“SHour”和结束时间“Ehour”
  3. 脚本会生成5个新的数据文件:
    • 第一个文件将包含所有具有分钟的记录:00、05、10、15、20 ... 00
    • 第二个文件将包含所有具有分钟的记录:01、06、11、16、21 ... 01
    • 第三个文件将包含所有具有分钟的记录:02、07、12、17、22 ... 02
    • 第四个文件将包含所有具有分钟的记录:03、08、13、18、23 ... 02
    • 第五个文件将包含所有具有分钟的记录:04、09、14、19、24 ... 02

【问题讨论】:

    标签: linux shell awk sed


    【解决方案1】:
    awk -F: 'NR>1{print > "file" (1+$2%5)}' input
    

    这应该做你想做的事。运行后,你应该会看到 5 个文件:file1-file5

    【讨论】:

      【解决方案2】:

      awk 与多个分隔符一起使用,并为每个文件使用单独的行。

      awk -F'[:,]' '$3 % 5 == 0' Input.txt > File1
      awk -F'[:,]' '$3 % 5 == 1' Input.txt > File2
      awk -F'[:,]' '$3 % 5 == 2' Play.input > File3
      awk -F'[:,]' '$3 % 5 == 3' Play.input > File4
      awk -F'[:,]' '$3 % 5 == 4' Play.input > File5
      

      【讨论】:

      • 对不起,我是新来发布stackoverflow的。我如何接受这个答案。
      • 答案很有效
      • 这行得通,它启动 5 个进程并遍历同一个文件 5 次。
      • @bajie88 只需点击绿色复选标记。
      • @kent 这是一个非常公平的观点,但在可理解性和效率之间存在权衡,这个答案有利于前者而不是后者。这种选择是否有意义取决于运算输入大小和技术水平。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-20
      • 2018-02-16
      • 2016-12-26
      • 2014-11-26
      • 1970-01-01
      • 2022-01-13
      • 2013-08-06
      相关资源
      最近更新 更多