2014-03-31 20 views
2

我有几千行文件列出了每十五分钟数据存放的目录。每个目录的名称都是以00,15,30或45结尾的时间戳。使用awk查找行中的缺失字段

此文件包含每个存在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找出打印出每个时间戳的一些方法和缺少该时间戳间隔时间(s)。

下面是我已经为仅包含五个字段行写:

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

如果你想让所有的数据看起来都一样,逻辑的好处是什么?只要执行'awk'{print $ 1“”$ 2“00 15 30 45”}'file'祝你好运。 – shellter

+0

不,我需要从其他位置复制数据,但仅限于那些缺失的时间间隔。所以这就是为什么我需要每个时间戳的缺失间隔列表。如果00,15和45在那个时间戳中,我只想复制30,而不是全部四个。 – user3481957

+0

不清楚我(至少)从您的描述和代码。你能否用你的样本输入的预期输出更新问题?祝你好运。 – shellter

回答

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中移除。打印时间戳和c(这将是缺失的字段)中的任何内容。

+0

谢谢,我知道这样的做法是正确的做法,但我的大脑只是不停地往下走。 – user3481957