鍍金池/ 問答/Python  C  Linux  網(wǎng)絡(luò)安全/ linux文本處理,兩行時(shí)間相減

linux文本處理,兩行時(shí)間相減

原始日志為:

[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值有單獨(dú)文件x.log:

abc
wvu
xxx

最終想的到相同x值的后面一樣減去前面一行的t值。即:

abc:
sdjljs t=3
sdsws  t=14

wvu:
sdsdess t=9

想問一下,awk或者python腳本有沒有合適的處理方式?

回答
編輯回答
夏木

大概像這樣:

# data
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
"""
# code
import re
from collections import defaultdict

dic = defaultdict(list)
golden_x, golden_t = None, None

for line in log.split('\n'):
    line = line.strip()
    if not line:
        continue
    m = re.match('\[t=(\d+)\](.+), x=(.+)', line)
    t, c, x = m.groups()
    if x == golden_x:
        dic[x].append((c, int(t) - golden_t))
    golden_x, golden_t = x, int(t)
    
for key, ct in dic.items():
    print(key+':')
    for c, t in ct:
        print(c, 't='+str(t))
    print()
# results
abc:
sdjljs t=3
sdsws t=14

wvu:
sdsdess t=9

我回答過的問題: Python-QA

2017年11月1日 04:51
編輯回答
陌如玉
# cat text.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

# cat x.log
abc
wvu
xxx


awk -F'[]=, ]' 'NR==FNR{a[$0];next}a[$6]{b[$6]=b[$6]"\n"$3" t="$2-a[$6]}{a[$6]=$2}END{for(i in b)printf "%s:%s\n\n",i,b[i]}' x.log, text.log

# 輸出:
abc:
sdjljs t=3
sdsws t=14

wvu:
sdsdess t=9
2017年11月19日 10:40
編輯回答
陌如玉
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

結(jié)果

     a        b    c    d   e
1  126   sdjljs  abc  123   3
2  140    sdsws  abc  126  14
4  248  sdsdess  wvu  239   9
2017年4月3日 04:02
編輯回答
生性
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)    

結(jié)果如下

abc:sdjljs t=3
abc:sdsws t=14
wvu:sdsdess t=9
2017年4月23日 15:06