【问题标题】:awk bash recursive brackets id sed trawk bash 递归括号 id sed tr
【发布时间】:2018-09-19 19:46:06
【问题描述】:

服务器在日期和冒号后的方括号中提供以逗号分隔的资产 ID 列表:

20160420084726:-
20160420085418:[111783178, 111557953, 111646835, 111413356, 111412662, 105618372, 111413557]
20160420085418:[111413432, 111633904, 111783198, 111792767, 111557948, 111413225, 111413281]
20160420085418:[111413432, 111633904, 111783198, 111792767, 111557948, 111413225, 111413281]
20160420085522:[111344871, 111394583, 111295547, 111379566, 111352520]
20160420090022:[111344871, 111394583, 111295547, 111379566, 111352520]

输入日志的格式为:

timestamp:ads

在哪里: timestamp 的格式为 YYYYMMDDhhmmssads 是用方括号括起来的广告资产 ID 的逗号分隔列表,如果没有返回广告,则为 -

任务的第一部分是编写一个脚本,输出一天中每十分钟的片断:

  • 返回的 ID 计数
  • 返回的唯一 ID 计数
  • 脚本应支持命令行参数来选择是否应提供唯一 ID 或总 ID。

使用上述日志摘录的示例输出(以总计模式):

20160420084:0
20160420085:26
20160420090:5

在唯一计数模式下,它会给出:

20160420084:0
20160420085:19
20160420090:5

我试过这个:

awk -F '[,:]' '
                    {
                      key = substr($1,1,11)"0"
                      count[key] += ($2 == "-" ? 0 : NF-1)
                    } 
                    END {
                    PROCINFO["sorted_in"] = "@ind_num_asc"
                    for (key in count) print key, count[key]
                  }
                    ' $LOGFILENAME | grep $DATE;

到目前为止,其他场景都失败了。比如这个:

日志文件: https://drive.google.com/file/d/1sXFvLyCH8gZrXiqf095MubyP7-sLVUXt/view?usp=sharing

结果的前几行应该是:

非唯一:

20160420000:1
20160420001:11
20160420002:13
20160420003:16
20160420004:3
20160420005:3
20160420010:6

独特:

20160420000:1
20160420001:5
20160420002:5
20160420003:5
20160420004:3
20160420005:3
20160420010:4

【问题讨论】:

  • 你试过什么?
  • 我没有看到关于这个问题的递归。

标签: bash awk sed grep unique


【解决方案1】:
$ cat tst.awk
BEGIN { FS="[]:[]+"; OFS=":" }
{
    tot = unq = 0
    time = substr($1,1,11)
    if ( /,/ ) {
        tot = split($2,tmp,/, ?/)
        for ( i in tmp ) {
            if ( !seen[time,tmp[i]]++ ) {
                unq++
            }
        }
    }
    tots[time] += tot
    unqs[time] += unq
}
END {
    for (time in tots) {
        print time, tots[time], unqs[time]
    }
}

$ awk -f tst.awk file
20160420084:0:0
20160420085:26:19
20160420090:5:5

按摩适合...

【讨论】:

  • 对于其他日志文件它不起作用,它必须将所有出现的十分钟间隔相加。
  • 我们所要做的就是您在问题中提供的示例。如果该示例不能真正代表您的真实数据,请修正您的示例。
【解决方案2】:
#!/bin/bash
while read; do
   dts=$( echo "$REPLY" | cut -d: -f1 )
   ids=$( echo "$REPLY" | grep -o '\[.*\]' )
   if [ $? -eq 0 ]; then
       ids=$( echo "$ids" | tr -d '[] ' | tr ',' '\n' | sort $1 )
       count=$( echo "$ids" | wc -l )
   else
       count=0
   fi
   echo $dts: $count
done

像这样运行:

./script.sh [-u] <input.txt

【讨论】:

  • 对于其他日志文件它不起作用,它必须将所有出现的十分钟间隔相加。
  • 好吧,您必须根据日志文件中的任何差异对其进行修改。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
  • 2018-09-20
  • 1970-01-01
  • 2013-08-17
  • 1970-01-01
  • 2020-02-03
  • 1970-01-01
相关资源
最近更新 更多