2015-04-08 3 views
1

У меня есть достаточно большой файл .dat, и я хочу использовать awk-скрипт для печати второго вхождения строки. .dat файл:awk для печати n-й экземпляр строки

YCSB Client 0.1 
Command line: -db com.yahoo.ycsb.db.MongoDbClient -s -P /home/james/YCSB/workloads/workloada -p mongodb.url=mongodb://192.168.0.8:27017 -p mongodb.database=ycsb -p recordcount=105 -t 
new database url = 192.168.0.8:27017/ycsb 
mongo connection created with 192.168.0.8:27017/ycsb 
[OVERALL], RunTime(ms), 1086.0 
[OVERALL], Throughput(ops/sec), 920.8103130755064 
[UPDATE], Operations, 506 
[UPDATE], AverageLatency(us), 988.4288537549407 
[UPDATE], MinLatency(us), 410 
[UPDATE], MaxLatency(us), 43786 
[UPDATE], 95thPercentileLatency(ms), 2 
[UPDATE], 99thPercentileLatency(ms), 6 
[UPDATE], Return=1, 506 
[UPDATE], 0, 432 
[UPDATE], 1, 40 
[UPDATE], 2, 9 
[UPDATE], 3, 9 
[UPDATE], 4, 4 
[UPDATE], 5, 6 

...

[UPDATE], 997, 0 
[UPDATE], 998, 0 
[UPDATE], 999, 0 
[UPDATE], >1000, 0 
[READ], Operations, 494 
[READ], AverageLatency(us), 429.2004048582996 
[READ], MinLatency(us), 177 
[READ], MaxLatency(us), 9428 
[READ], 95thPercentileLatency(ms), 1 
[READ], 99thPercentileLatency(ms), 5 
[READ], Return=1, 494 
[READ], 0, 460 
[READ], 1, 16 
[READ], 2, 6 
[READ], 3, 3 
[READ], 4, 4 

...

[READ], 995, 0 
[READ], 996, 0 
[READ], 997, 0 
[READ], 998, 0 
[READ], 999, 0 
[READ], >1000, 0 
[CLEANUP], Operations, 1 
[CLEANUP], AverageLatency(us), 1397.0 
[CLEANUP], MinLatency(us), 1397 
[CLEANUP], MaxLatency(us), 1397 
[CLEANUP], 95thPercentileLatency(ms), 1 
[CLEANUP], 99thPercentileLatency(ms), 1 

Я использую эту команду, чтобы попытаться напечатать второе вхождение AverageLatency и Operations:

awk -F'[,=]|://' '/^Command/{db=$2}/AverageLatency/{i=$3}/Operations/{t=$3}END{print t i,db}' 

Однако это, кажется, возвращаются значения из нижней части файла или 3-го появления:

1 1397.0 mongodb 

Я относительно новым для использования AWK, но кажется, что он работает в нижней части файла вверх?

Я попытался использовать awk /AverageLatency/{i++}i==2 в моей команде, поскольку он работает сам по себе и возвращает правильные значения.

Просто для ясности желаемого результата здесь будет 494 429.2004048582996 mongodb

+0

он продолжает читать через файл до тех пор, пока он не дойдет до конца, сопоставляя каждый раз, когда он находит «AverageLatency», поэтому он печатает значения из последнего раза. Чтобы узнать, что я имею в виду, do '/ AverageLatency/{i = $ 3; exit} END {...' Удачи – shellter

+0

Да! awk -F '[, =] |: //' '/^Command/{db = $ 2}/AverageLatency/{i ++} i == 2 {i = $ 3; exit}/Operations/{t = $ 3} END { print ti, db} ' Работает отлично. – johnnydrama

+0

не стесняйтесь оставлять свой собственный ответ и принимать через 48 часов за 15 очков репутации. Добро пожаловать в S.O. Удачи. – shellter

ответ

1

Это должно сделать:

awk -F'[=:]|, ' '/^Command/{db=$3} /Operations/ && ++i==2 {f=1;t=$NF} /AverageLatency/ && f {print t,$NF,db;exit}' file 
494 429.2004048582996 mongodb 

Когда второй Operations найден получить свои данные и флаг f
Если флаг f верно и AverageLatency печать данных

Если заказ шаблона найти не знаю, и вы просто хотите получить из них данные:

awk -F'[=:]|, ' '/^Command/{db=$3} /Operations/ && ++i==2 {f=1;t=$NF} /AverageLatency/ && ++j==2 {a=$NF} END {print t,a,db}' file 
494 429.2004048582996 mongodb 

Если AverageLatency всегда приходит после Operations, просто захватить следующую строку.

awk -F'[=:]|, ' '/^Command/{db=$3} /Operations/ && ++i==2 {f=NR;t=$NF} NR==f+1 && f {print t,$NF,db;exit}' file 
494 429.2004048582996 mongodb 

Или вы можете использовать getline, но будьте осторожны с ним.

awk -F'[=:]|, ' '/^Command/{db=$3} /Operations/ && ++i==2 {t=$NF;getline;print t,$NF,db;exit}' file 
494 429.2004048582996 mongodb 
1

Используйте, если заявление и счетчик. Блок END {} запускается в конце обработки всего ввода. Таким образом, он будет распечатывать только последние значения, соответствующие вашей реализации.

awk -F'[,=]|://' 'BEGIN{i=0} /^Command/{db=$2}/AverageLatency/{if(2 == ++i){ print t $3,db; exit; } }/Operations/{t=$3}' 
2
awk -F'[,=]|://' '/^Command/{db=$2}/AverageLatency/{i++}i==2{i=$3;exit}/Operations/{t=$3}END{prin‌​t t i,db}' 

работает отлично. Сценарий, который я использовал, продолжал просматривать весь файл даже после того, как он соответствовал требуемой строке.

Смежные вопросы