可以漂亮地打印Awk的代码吗?

时间:2019-04-18 12:22:29

标签: awk gnu pretty-print

我经常发现自己写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");

如何使内容更具可读性?

1 个答案:

答案 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,并使用:

  • 不希望将输出自动存储​​在“ awkprof.out”中。
  • -将输出保存在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
}