我有几千个行文件,列出每十五分钟存入数据的目录。每个目录的名称都是以00,15,30或45结尾的时间戳。
此文件包含每个时间戳,其中包含15分钟的时间间隔。例如,
io_credit 2014030100 00 15 30 45
io_credit 2014030101 15 30
io_credit 2014030102 45
io_credit 2014030103 00 15 30 45
正如您所看到的,某些时间戳错过了一定的十五分钟间隔。另请注意,即使缺少时间戳,写入时间戳的顺序也始终相同。因此,如果15是唯一缺少的时间戳,则00,30和45将按顺序排列。 Sames适用于所有其他时间戳。换句话说,你永远不会看到像
这样的东西45 15 30
我一直在努力用awk来弄清楚每个时间戳的打印方式以及该时间戳的缺少间隔。
以下是我为仅包含五个字段的行编写的内容:
cat file | awk '{if (NF == 5) for (i = 3; i <= 5; i++) { if (i == 3 && $i == "00") continue; else if (i == 3 && $i == "15") missing="00"; continue; if (i == 4 && $i == "15") continue; else if (i == 4 && $i == "30") missing=missing " 15"; if (i == 5 && $i == "30") missing=missing "45"; else missing=missing "30"; } {print $1,$2, missing }}'
然而,这只会打印“00”,并且不会为与(NF == 5)限定符匹配的每一行打印其他内容。
我在这里做错了什么?
答案 0 :(得分:1)
以下查看文件中的每一行。如果该行具有所有时间戳,则忽略该行。如果没有,则打印缺少的时间戳:
$ awk 'NF==6 {next} {c="00 15 30 45"; for(i=3;i<=NF;i++){sub($i," ",c)}; print $2" " c} ' file
2014030101 00 45
2014030102 00 15 30
工作原理:如果一行上有所有时间戳,那么该行有6个字段。所有喜欢六个字段(NF==6
)的人都会被忽略。否则,变量c
将设置为"00 15 30 45"
。然后,代码循环遍历每个时间戳,如果存在,则将其从c
中删除。 1}}(可能是缺少的字段)中的时间戳和剩余内容将被打印出来。