如何同时使用 gnuplot 和 awk 遍历日志文件列表
How to iterate over a list of log files using gnuplot and awk simultaneously
我正在使用 awk 和 gnuplot 从一系列名为 bt.B.*.log 其中 * 可以是1、4、9 和 16(这些是进程数)。
枪图下我运行的代码是
system "awk 'BEGIN { FS = \"[ \t]*=[ \t]*\" } /Time in seconds/ { s += ; c++ } /Total processes/ { if (! CP) CP = } END { print CP, s/c }' bt.B.1.log > tavg.dat"
system "awk 'BEGIN { FS = \"[ \t]*=[ \t]*\" } /Time in seconds/ { s += ; c++ } /Total processes/ { if (! CP) CP = } END { print CP, s/c }' bt.B.4.log >> tavg.dat"
system "awk 'BEGIN { FS = \"[ \t]*=[ \t]*\" } /Time in seconds/ { s += ; c++ } /Total processes/ { if (! CP) CP = } END { print CP, s/c }' bt.B.9.log >> tavg.dat"
system "awk 'BEGIN { FS = \"[ \t]*=[ \t]*\" } /Time in seconds/ { s += ; c++ } /Total processes/ { if (! CP) CP = } END { print CP, s/c }' bt.B.16.log >> tavg.dat"
system "awk 'BEGIN { FS = \"[ \t]*[=][ \t]\" } /Time in seconds/ { printf \"%s\", } /Total processes/ { if (CP) { printf \"\n\" } else { CP = ; printf \"%s\n\", } }' bt.B.1.log > t.dat"
system "awk 'BEGIN { FS = \"[ \t]*[=][ \t]\" } /Time in seconds/ { printf \"%s\", } /Total processes/ { if (CP) { printf \"\n\" } else { CP = ; printf \"%s\n\", } }' bt.B.4.log >> t.dat"
system "awk 'BEGIN { FS = \"[ \t]*[=][ \t]\" } /Time in seconds/ { printf \"%s\", } /Total processes/ { if (CP) { printf \"\n\" } else { CP = ; printf \"%s\n\", } }' bt.B.9.log >> t.dat"
system "awk 'BEGIN { FS = \"[ \t]*[=][ \t]\" } /Time in seconds/ { printf \"%s\", } /Total processes/ { if (CP) { printf \"\n\" } else { CP = ; printf \"%s\n\", } }' bt.B.16.log >> t.dat"
#set xrange [0:20]
#set yrange [0:300]
set encoding iso_8859_1
set xlabel "Número de processos"
set ylabel "Tempo médio de execução (s)"
set border 3
set rmargin 10
unset key
set title "bt.B.*.log"
set tics nomirror
set mxtics
set mytics
set arrow from graph 1,0 to graph 1.05,0 filled
set arrow from graph 0,1 to graph 0,1.05 filled
plot "tavg.dat" using 1:2 smooth bezier title "bt.b.*.log", '' using 1:2 with points ps 3 title ""
请注意,我的做法是在第一个系统命令中使用 > 创建文件 tavg.dat,然后使用 >> 将其他结果附加到同一文件。创建 t.dat 文件的同一组织。
这里的问题是如何遍历 4 个日志文件以避免在脚本中重复。
只需定义两个函数,它们生成适当的字符串,您可以将这些字符串提供给 system
函数:
tavg(n) = "awk 'BEGIN { FS = \"[ \t]*=[ \t]*\" } /Time in seconds/ { s += ; c++ } /Total processes/ { if (! CP) CP = } END { print CP, s/c }' bt.B.".n.".log ".(n == 1 ? ">" : ">>")." tavg.dat;"
t(n) = "awk 'BEGIN { FS = \"[ \t]*[=][ \t]\" } /Time in seconds/ { printf \"%s\", } /Total processes/ { if (CP) { printf \"\n\" } else { CP = ; printf \"%s\n\", } }' bt.B.".n.".log ".(n == 1 ? ">" : ">>")." t.dat;"
do for [n in "1 4 9 16"] { system(tavg(n).t(n)) }
...
plot "tavg.dat" ...
我正在使用 awk 和 gnuplot 从一系列名为 bt.B.*.log 其中 * 可以是1、4、9 和 16(这些是进程数)。
枪图下我运行的代码是
system "awk 'BEGIN { FS = \"[ \t]*=[ \t]*\" } /Time in seconds/ { s += ; c++ } /Total processes/ { if (! CP) CP = } END { print CP, s/c }' bt.B.1.log > tavg.dat"
system "awk 'BEGIN { FS = \"[ \t]*=[ \t]*\" } /Time in seconds/ { s += ; c++ } /Total processes/ { if (! CP) CP = } END { print CP, s/c }' bt.B.4.log >> tavg.dat"
system "awk 'BEGIN { FS = \"[ \t]*=[ \t]*\" } /Time in seconds/ { s += ; c++ } /Total processes/ { if (! CP) CP = } END { print CP, s/c }' bt.B.9.log >> tavg.dat"
system "awk 'BEGIN { FS = \"[ \t]*=[ \t]*\" } /Time in seconds/ { s += ; c++ } /Total processes/ { if (! CP) CP = } END { print CP, s/c }' bt.B.16.log >> tavg.dat"
system "awk 'BEGIN { FS = \"[ \t]*[=][ \t]\" } /Time in seconds/ { printf \"%s\", } /Total processes/ { if (CP) { printf \"\n\" } else { CP = ; printf \"%s\n\", } }' bt.B.1.log > t.dat"
system "awk 'BEGIN { FS = \"[ \t]*[=][ \t]\" } /Time in seconds/ { printf \"%s\", } /Total processes/ { if (CP) { printf \"\n\" } else { CP = ; printf \"%s\n\", } }' bt.B.4.log >> t.dat"
system "awk 'BEGIN { FS = \"[ \t]*[=][ \t]\" } /Time in seconds/ { printf \"%s\", } /Total processes/ { if (CP) { printf \"\n\" } else { CP = ; printf \"%s\n\", } }' bt.B.9.log >> t.dat"
system "awk 'BEGIN { FS = \"[ \t]*[=][ \t]\" } /Time in seconds/ { printf \"%s\", } /Total processes/ { if (CP) { printf \"\n\" } else { CP = ; printf \"%s\n\", } }' bt.B.16.log >> t.dat"
#set xrange [0:20]
#set yrange [0:300]
set encoding iso_8859_1
set xlabel "Número de processos"
set ylabel "Tempo médio de execução (s)"
set border 3
set rmargin 10
unset key
set title "bt.B.*.log"
set tics nomirror
set mxtics
set mytics
set arrow from graph 1,0 to graph 1.05,0 filled
set arrow from graph 0,1 to graph 0,1.05 filled
plot "tavg.dat" using 1:2 smooth bezier title "bt.b.*.log", '' using 1:2 with points ps 3 title ""
请注意,我的做法是在第一个系统命令中使用 > 创建文件 tavg.dat,然后使用 >> 将其他结果附加到同一文件。创建 t.dat 文件的同一组织。
这里的问题是如何遍历 4 个日志文件以避免在脚本中重复。
只需定义两个函数,它们生成适当的字符串,您可以将这些字符串提供给 system
函数:
tavg(n) = "awk 'BEGIN { FS = \"[ \t]*=[ \t]*\" } /Time in seconds/ { s += ; c++ } /Total processes/ { if (! CP) CP = } END { print CP, s/c }' bt.B.".n.".log ".(n == 1 ? ">" : ">>")." tavg.dat;"
t(n) = "awk 'BEGIN { FS = \"[ \t]*[=][ \t]\" } /Time in seconds/ { printf \"%s\", } /Total processes/ { if (CP) { printf \"\n\" } else { CP = ; printf \"%s\n\", } }' bt.B.".n.".log ".(n == 1 ? ">" : ">>")." t.dat;"
do for [n in "1 4 9 16"] { system(tavg(n).t(n)) }
...
plot "tavg.dat" ...