简单任务 2 - 计算并替换

用 iozone 跑出来的文件系统性能数据,格式示例:

# file-size     initial-read
1k 3029.832
2k 3010.015
4k 3223.711
8k 3303.412
16k 3488.440

简单任务:将 Nk 替换成 N*1024 的结果,m 和 g 依此类推。目的是要对处理之后的结果用 gnuplot 作图。

用正则表达式很容易匹配目标文本,但可惜不能直接计算。我的解法是先将整个文本替换成一个可执行的 shell 脚本 - 第一行插入 "cat << EOF",最后一行添 "EOF",中间的 k, m, g 替换成 "$((..))",然后用 shell 解释执行,利用 shell 进行计算。有点土,不过至少可以方便批量处理。

sed -e '1i\cat << EOF' \
-e 's/\b\([0-9]\+\)k\b/$((\1*1024))/g' \
-e 's/\b\([0-9]\+\)m\b/$((\1*1024*1024))/g' \
-e 's/\b\([0-9]\+\)g\b/$((\1*1024*1024*1024))/g' \
-e '$i\EOF' \
iozone-out.txt | bash

将 sed 表达式写到一个单独的 .sed 文件,可方便批量处理。再完善一点就先把 $ 和 ` 转个义。

for f in *.txt; do sed -f x.sed $f | bash > $f.new; done

谁有更好的解法?

简单任务 1 - 合并连续的空行

简单任务 - 将多个连续的空行合并成一个空行。来自一个实际问题:打印一个很长的 RFC 文档,希望能省一些纸张。

很久以前就遇到过这个问题,因为发现 sed 不能匹配 '\n',当时的解法是写了个 shell 脚本处理。Vim 可以用 '\n' 匹配换行符,解决方案是:

vim '+%s/^\n\+/\r/g' +x rfc.txt

考虑空行上可以有空白字符的话,还能再完善一点:

vim '+%s/^\(\s*\n\)\+/\r/g' +x rfc.txt

这是目前的“最佳应法”,欢迎提供更佳的解法。

特别鸣谢:刚开始缺少 '^' 怎么都不能成功,经老婆指正方才解决。你怎么也想不到,我老婆作为一个文科生,竟然能把 vim 使得出神入化,还在她们公司内部做了一个四十分钟的讲座!

 1

Tags

Blogroll

Fairy World | STUPiD | 阅微草堂 | ShelleX | 流浪五天