您好,欢迎来到[编程问答]网站首页   源码下载   电子书籍   软件下载   专题
当前位置:首页 >> 编程问答 >> Linux >> linux文本处理,两行时间相减

linux文本处理,两行时间相减(1/2)

来源:网络整理     时间:2018/1/24 0:52:37     关键词:

关于网友提出的“ linux文本处理,两行时间相减”问题疑问,本网通过在网上对“ linux文本处理,两行时间相减”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:

问题: linux文本处理,两行时间相减
描述:

原始日志为:

[t=123]xyzzda, x=abc
[t=126]sdjljs, x=abc
[t=140]sdsws, x=abc
[t=239]dsjdjs, x=wvu
[t=248]sdsdess, x=wvu

所有x值有单独文件x.log:

abc
wvu
xxx

最终想的到相同x值的后面一样减去前面一行的t值。即:

abc:
sdjljs t=3
sdsws  t=14

wvu:
sdsdess t=9

想问一下,awk或者python脚本有没有合适的处理方式?


解决方案1:

import re

s = re.compile('\[t=(\d+)\](.+), x=(.+)').findall(log)    
s.sort(key=lambda i: (i[2], i[0]))
res = [(s[i+1][2], s[i+1][1], int(s[i+1][0])-int(s[i][0]))
       for i in range(len(s)-1) if s[i+1][2] == s[i][2]]
out =  '\n'.join(['{}:{} t={}'.format(*i) for i in res])
print(out)    

结果如下

abc:sdjljs t=3
abc:sdsws t=14
wvu:sdsdess t=9
解决方案2:

import pandas as pd
import re

log = """
[t=123]xyzzda, x=abc
[t=126]sdjljs, x=abc
[t=140]sdsws, x=abc
[t=239]dsjdjs, x=wvu
[t=248]sdsdess, x=wvu
"""

log = log.strip("\n")
data = re.findall('\[t=(\d+)\](.+), x=(.+)', log)

df = pd.DataFrame(data, columns=["a", "b", "c"])
shift_values = df["a"].groupby(df["c"]).shift(1)
df["d"] = shift_values
df = df.dropna()

df["e"] = df["a"].astype(int) - df["d"].astype(int)

print df

结果

     a        b    c    d   e
1  126   sdjljs  abc  123   3
2  140    sdsws  abc  126  14
4  248  sdsdess  wvu  239   9
解决方案3:

大概像这样:

相关图片

相关文章