【问题标题】:How I make a list of missing integer from a sequence using bash如何使用 bash 从序列中列出缺失整数
【发布时间】:2020-01-22 11:00:33
【问题描述】:

我有一个文件,比如说 files_190911.csv,其内容如下。

EDR​​_MPU023_09_20190911080534.csv.gz
EDR_MPU023_10_20190911081301.csv.gz
EDR_MPU023_11_20190911083544.csv.gz
EDR_MPU023_14_20190911091405.csv.gz
EDR_MPU023_15_20190911105513.csv.gz
EDR_MPU023_16_20190911105911.csv.gz
EDR_MPU024_50_20190911235332.csv.gz
EDR_MPU024_51_20190911235400.csv.gz
EDR_MPU024_52_20190911235501.csv.gz
EDR_MPU024_54_20190911235805.csv.gz
EDR_MPU024_55_20190911235937.csv.gz
EDR_MPU025_24_20190911000050.csv.gz
EDR_MPU025_25_20190911000155.csv.gz
EDR_MPU025_26_20190911000302.csv.gz
EDR_MPU025_29_20190911000624.csv.gz

我想列出那些使用 bash 脚本的缺失序列。
每个 MPUXXX 都有自己的序列。所以该文件中有多个序列。
缺失列表的日期时间将使用前一个序列。
从上面的示例中,结果将是这样的。

EDR​​_MPU023_12_20190911083544.csv.gz
EDR_MPU023_13_20190911083544.csv.gz
EDR_MPU024_53_20190911235501.csv.gz
EDR_MPU025_27_20190911000302.csv.gz
EDR_MPU025_28_20190911000302.csv.gz

如果只有一个序列会更简单。 所以我可以使用这样的东西。

awk '{for(i=p+1; i<$1; i++) print i} {p=$1}'

但我知道这不能用于多个序列。

【问题讨论】:

标签: bash shell perl awk


【解决方案1】:

已编辑(感谢@Cyrus!)

AWK 是你的朋友:

#!/usr/bin/awk

BEGIN {
    FS="[^0-9]*"
    last_seq = 0;
    next_serial = 0;
}

{
    cur_seq = $2;
    cur_serial = $3;
    if (cur_seq != last_seq) {
        last_seq = cur_seq;
        ts = $4
        prev = cur_serial;
    } else {
        if (cur_serial == next_serial) {
            ts = $4;
        } else {
            for (i = next_serial; i < cur_serial; i++) {
                print "EDR_MPU" last_seq "_" i "_" ts ".csv.gz"
            }
        }
    }
    next_serial = cur_serial + 1;
}

然后你做:

$ < files_190911.csv awk -f script.awk 
EDR_MPU023_12_20190911083544.csv.gz
EDR_MPU023_13_20190911083544.csv.gz
EDR_MPU024_53_20190911235501.csv.gz
EDR_MPU025_27_20190911000302.csv.gz
EDR_MPU025_28_20190911000302.csv.gz

FS= 的赋值按正则表达式分割行。其余程序检测序列中的漏洞并使用适当的时间戳打印它们。

【讨论】:

  • 用 GNU awk 删除 sed:添加到您的 BEGIN 部​​分 FS="[^0-9]*" 并将 $3 替换为 $4,将 $2 替换为 $3 和 @987654331 @ 与 $2.
  • 我不知道FS 可能是一个正则表达式 - 编辑后 - 谢谢@Cyrus!!
  • 来自man awk (GNU awk):如果 FS 是单个字符,则字段由该字符分隔。如果 FS 是空字符串,那么每个单独的字符将成为一个单独的字段。否则,FS 应该是一个完整的正则表达式。
  • 只是想确保[^0-9] 不是其中一个字符吗?
  • 正确,^ 表示括号内没有其他字符。
猜你喜欢
  • 2012-09-08
  • 2017-05-25
  • 2019-03-21
  • 1970-01-01
  • 2021-10-05
  • 1970-01-01
  • 2019-04-27
  • 2018-11-28
  • 1970-01-01
相关资源
最近更新 更多