标签: mawk

如何在mawk中打​​印自己的脚本名称?

在 bash 中$0包含脚本的名称,但在 awk 中,如果我使用以下内容创建一个名为 myscript.awk 的脚本:

#!/usr/bin/awk -f
BEGIN{ print ARGV[0] }
Run Code Online (Sandbox Code Playgroud)

并运行它,它只会打印“awk”。此外,带有 i>0 的 ARGV[i] 仅用于命令行中的脚本参数。那么,如何让它打印脚本的名称,在这种情况下是“myscript.awk”?

scripting awk mawk

14
推荐指数
4
解决办法
2801
查看次数

为什么正则表达式 `"\.pdf"` 在 gawk 中匹配 `/.../pdf.../...` 而在 mawk 中不匹配?

如何在 lsof 输出中仅提取 pid 列和仅提取路径名列?

awk '{ for (i=9; i<=NF; i++) {
    if ($i ~ "string" && $1 != "wineserv" && $5 == "REG" && $NF ~ "\.pdf") {
        $1=$2=$3=$4=$5=$6=$7=$8=""
        print
    }
}}'
Run Code Online (Sandbox Code Playgroud)

正则表达式在 gawk 中"\.pdf"匹配/.../pdf.../...,但在 mawk 中不匹配。我想知道为什么?

谢谢。

awk regular-expression mawk gawk

7
推荐指数
2
解决办法
643
查看次数

便携式检查阵列

Gawk 有“isarray”:

if (isarray(x))
  print "is array"
else
  print "is scalar"
Run Code Online (Sandbox Code Playgroud)

但是 Mawk 和 "gawk --posix" 不会:

fatal: function 'isarray' not defined
Run Code Online (Sandbox Code Playgroud)

这可能会导致问题:

x
x[1]
fatal: attempt to use scalar 'x' as an array
Run Code Online (Sandbox Code Playgroud)

或者:

x[1]
x
fatal: attempt to use array 'x' in a scalar context
Run Code Online (Sandbox Code Playgroud)

awk 可以在不使用“isarray”函数的情况下检测数组吗?

array awk posix mawk gawk

5
推荐指数
1
解决办法
1165
查看次数

使用 awk 将日期时间戳从 12 小时转换为 24

我正在使用一个包含以下结构数据的 csv 文件:

"12345","BLAH","DEDA","0.000","1.111","2.22222","3.3333333,"15/12/2017 4:26:00 PM"
Run Code Online (Sandbox Code Playgroud)

我想将 12 小时制转换为 24 小时制。以下显示了我最终想要实现的目标:

"12345","BLAH","DEDA","0.000","1.111","2.22222","3.3333333,"15/12/2017 16:26:00"
Run Code Online (Sandbox Code Playgroud)

我找到了以下问题的答案,该问题似乎解决了我的问题时间段的转换。 /sf/ask/565878141/#8084087

所以有了以上,我相信我必须做以下过程(可能有更有效的方法):

  1. 暂时将日期和时间分成自己的记录

    "12345","BLAH","DEDA","0.000","1.111","2.22222","3.3333333,"15/12/2017","4:26:00 PM"

  2. 定位时间记录并将其转换为我想要的 24 小时格式
  3. 将日期和时间记录连接回单个记录

我正在尝试使用 awk 来实现这一点,但被困在第一部分!awk 是适合这项工作的工具,还是您会推荐其他工具?

我从第 1 步开始。我什至无法成功定位日期!

awk 'BEGIN {FS=","} { gsub(/[0-9]\{2\}\/[0-9]\{2\}\/[0-9]\{4\}/, "TESTING"); print }' myfile.csv
Run Code Online (Sandbox Code Playgroud)

awk text-processing mawk

5
推荐指数
1
解决办法
1730
查看次数

awk 的数字格式和舍入问题

当我试图找到一列值的平均值时,我想得到确切的数字。

例如,这是输入值列:

1426044
1425486
1439480
1423677
1383676
1360088
1390745
1435123
1422970
1394461
1325896
1251248
1206005
1217057
1168298
1153022
1199310
1250162
1247917
1206836
Run Code Online (Sandbox Code Playgroud)

当我使用以下命令时:

... | awk '{ sum+=$1} END { print sum/NR}'
Run Code Online (Sandbox Code Playgroud)

我得到以下的输出:1.31638e+06。但是,我想要1316375.05这种格式的确切数字,甚至更好 1,316,375.05

如何仅使用命令行工具执行此操作?

编辑 1

我发现了以下单行 awk 命令,它将为我提供最大值、最小值和平均值:

awk 'NR == 1 { max=$1; min=$1; sum=0 } { if ($1>max) max=$1; if ($1<min) min=$1; sum+=$1;} END {printf "Min: %d\tMax: %d\tAverage: %.2f\n", min, max, sum/NR}'
Run Code Online (Sandbox Code Playgroud)

为什么NR必须初始化为1?当我删除时NR == 1,我得到了错误的结果。

编辑 2

我从有没有办法在单个命令中获取数字列表的最小值、最大值、中值和平均值中找到以下 …

command-line awk numeric-data mawk text-formatting

4
推荐指数
2
解决办法
776
查看次数

在 Mawk 中行走多维数组

我能够在 gawk 中正确执行此操作,但是当我尝试将我的代码发布到它将运行的机器时,我意识到它正在使用 mawk ...

$ cat multidim.gawk
# test of multidimensional arrays
// {
        A[1][1]="A11"
        A[1][2]="A12"
        A[2][1]="A21"
        A[2][2]="A22"

        i=2
        for ( j in A[i] )
        {
                print "i=" i " j=" j " A[i][j]=" A[i][j]
        }
}


$ echo hi | awk -f multidim.gawk
i=2 j=1 A[i][j]=A21
i=2 j=2 A[i][j]=A22
Run Code Online (Sandbox Code Playgroud)

似乎 mawk 对多维数组的工作方式有不同的看法。当我使用 mawk 在 Debian 上运行它时,出现语法错误。A[i,j] 似乎是正确的语法,它“合成”了多维数组。

所以我尝试了两件事,都不起作用:

$ cat multidim.mawk
// {
        A[1,1]="A11"
        A[1,2]="A12"
        A[2,1]="A21"
        A[2,2]="A22"

        i=2
        for ( j in A[i] )
        {
                print "i=" i …
Run Code Online (Sandbox Code Playgroud)

awk mawk

3
推荐指数
1
解决办法
3065
查看次数

如何使用 mawk 指定正则表达式量词?

我熟悉指定有界正则表达式量词的概念如下:

Quantifier  Legend               Example    Sample Match

{3}         Exactly three times  \D{3}      ABC
{2,4}       Two to four times    \d{2,4}    156
{3,}        Three or more times  \w{3,}     regex_tutorialer
Run Code Online (Sandbox Code Playgroud)

但是,我无法mawk在手册页或在线找到与上述类似的内容。

mawk命令是否具有此功能,或者是否有不同的方式来实现相同的效果?

我正在使用版本 1.3.3

regular-expression mawk

3
推荐指数
1
解决办法
498
查看次数

awk (mawk): 正则表达式编译失败(缺少操作数)

我想将以下正则表达式与 awk 一起使用来验证电话号码:

echo 012-3456-7890 | awk '/^\(?0[1-9]{2}\)?(| |-|.)[1-9][0-9]{3}( |-|.)[0-9]{4}$/ {print $0}'
Run Code Online (Sandbox Code Playgroud)

但我收到以下错误:

awk: line 1: regular expression compile failed (missing operand)
Run Code Online (Sandbox Code Playgroud)

awk regular-expression mawk

1
推荐指数
1
解决办法
3650
查看次数