标签: mawk

我可以使用 -v 将数组传递给 awk 吗?

我希望能够将数组变量传递给awk. 我指的不是 shell 数组,而是本机数组awk。我知道我可以像这样传递标量变量:

awk -vfoo="1" 'NR==foo' file
Run Code Online (Sandbox Code Playgroud)

我可以使用相同的机制来定义awk数组吗?就像是:

$  awk -v"foo[0]=1" 'NR==foo' file
awk: fatal: `foo[0]' is not a legal variable name
Run Code Online (Sandbox Code Playgroud)

我已经尝试了上述几种变体,但它们都不适用于我的 Debian 上的 GNU awk 4.1.1。那么,有没有任何版本awkgawkmawk或其他任何东西),可以接受来自一个数组-v开关?

我知道我可以解决这个问题并且可以很容易地想到这样做的方法,我只是想知道是否有任何awk实现本身支持这种功能。

arrays awk gawk mawk

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

通过管道传输到 awk 的 Bash 命令有时会被缓冲

系统:Linux 4.13.0-43-generic #48~16.04.1-Ubuntu BASH_VERSION='4.3.48(1)-release'

命令:

while sleep 5
do
  date +%T
done | awk -F: '{print $3}'
Run Code Online (Sandbox Code Playgroud)

应打印“日期”输出的第三个字段(秒),每 5 秒一行。问题:仅当管道缓冲区已满时,awk 才从管道读取数据并处理其输入。即当生成超过 4K 的输入时。

awkcat替换时,按预期每 5 秒打印一行。

这段代码是从一个在其他系统上运行良好的 shell 脚本简化而来的,所以这个系统中肯定有一些关于 bash、awk 及其配置的内容。

简而言之,有没有办法说服awk在从管道读取数据时表现得像cat一样?

@Ed Morton:我确实尝试在每次打印后添加fflush(),但它不起作用——这表明问题出在 awk 的输入上,而不是输出上。我还尝试添加对system("date")的调用,这表明 awk 确实一次获取所有输入行,而不是在生成它们时立即获取。

对于那些提问的人:

$ awk -W version
mawk 1.3.3 Nov 1996, Copyright (C) Michael D. Brennan

compiled limits:
max NF             32767
sprintf buffer      2040
Run Code Online (Sandbox Code Playgroud)

linux bash awk mawk

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

标签 统计

awk ×2

mawk ×2

arrays ×1

bash ×1

gawk ×1

linux ×1