我经常发现自己写Awk one-liners随着时间的流逝变得越来越复杂。
我知道我总是可以在其中创建Awk文件来继续添加用例,但是它肯定不如在命令行上更改文本有用。
为此:我有什么办法可以打印Awk的代码,从而使我更有意义?
例如,鉴于此:
var SIZE = 100000;
var dates = [];
for (var i = 0; i < SIZE; i++) {
var buf = new ArrayBuffer(14);
var str = "";
buf[0] = Math.floor(Math.random()*10);
buf[1] = Math.floor(Math.random()*10);
buf[2] = Math.floor(Math.random()*10);
buf[3] = Math.floor(Math.random()*10);
buf[4] = Math.floor(Math.random()*10);
buf[5] = Math.floor(Math.random()*10);
buf[6] = Math.floor(Math.random()*10);
buf[7] = Math.floor(Math.random()*10);
buf[8] = Math.floor(Math.random()*10);
buf[9] = Math.floor(Math.random()*10);
buf[10] = Math.floor(Math.random()*10);
buf[11] = Math.floor(Math.random()*10);
buf[12] = Math.floor(Math.random()*10);
buf[13] = Math.floor(Math.random()*10);
for (var ii = 0; ii < 14; ii++) {
str += buf[ii];
}
dates.push({buf, str});
}
function convertDateTimeToFormatBuf(date, format) {
var buf = new ArrayBuffer(14);
var result = new Uint8Array(buf);
var positions = {
y: 0,
M: 4,
d: 6,
H: 8,
m: 10,
s: 12
};
for (var index = 0; index < 14; index++) {
result[index] = date[positions[format[index]]++];
}
return result;
}
function convertDateTimeToFormatStr(date, format) {
var result = "";
var positions = {
y: 0,
M: 4,
d: 6,
H: 8,
m: 10,
s: 12
};
for (var index = 0; index < 14; index++) {
result += date[positions[format[index]]++];
}
return result;
}
console.time("Buffer");
for (i = 0; i < SIZE; i++) {
convertDateTimeToFormatBuf(dates[i].buf, "MMddyyyyHHmmss");
}
console.timeEnd("Buffer");
console.time("String");
for (i = 0; i < SIZE; i++) {
convertDateTimeToFormatStr(dates[i].str, "MMddyyyyHHmmss");
}
console.timeEnd("String");
如何使内容更具可读性?
答案 0 :(得分:5)
Ed Morton showed me认为GNU awk具有-o
选项可以漂亮地打印:
GNU Awk User's Guide, on Options
-o [文件]
-漂亮的打印[=文件]启用awk程序的漂亮打印。表示
--no-optimize
。默认情况下,输出程序在名为awkprof.out
的文件中创建(请参见Profiling)。可选的 file 参数使您可以为输出指定其他文件名。如果提供了 file ,则-o
和 file 之间不允许有空格。注意:过去,此选项也会执行您的程序。情况不再如此。
所以这里的关键是使用-o
,并使用:
-
将输出保存在stdout中。file
,以将输出存储在名为 file 的文件中。实时观看:
$ gawk -o- 'BEGIN {print 1} END {print 2}'
BEGIN {
print 1
}
END {
print 2
}
或者:
$ gawk -o- 'flag{ if (/PAT2/){printf "%s", buf; flag=0; buf=""} else buf = buf $0 ORS}; /PAT1/{flag=1}' file
flag {
if (/PAT2/) {
printf "%s", buf
flag = 0
buf = ""
} else {
buf = buf $0 ORS
}
}
/PAT1/ {
flag = 1
}