在 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”?
从如何在 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 中不匹配。我想知道为什么?
谢谢。
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”函数的情况下检测数组吗?
我正在使用一个包含以下结构数据的 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
所以有了以上,我相信我必须做以下过程(可能有更有效的方法):
暂时将日期和时间分成自己的记录
"12345","BLAH","DEDA","0.000","1.111","2.22222","3.3333333,"15/12/2017","4:26:00 PM"
我正在尝试使用 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) 当我试图找到一列值的平均值时,我想得到确切的数字。
例如,这是输入值列:
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
我能够在 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) 我熟悉指定有界正则表达式量词的概念如下:
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
我想将以下正则表达式与 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)