标签: gawk

我可以使用 -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可以跳过不存在的文件,无种族?

有没有办法让awk(gawk)忽略或跳过丢失的文件?也就是说,在命令行上传递的文件不再存在于文件系统中(例如,在/ proc/[1-9]*下快速出现/消失文件).

默认情况下,丢失的文件是致命错误:-(

我希望能够做到这样的事情:

BEGIN { MISSING_FILES_ARE_FATAL = 0 }  # <- Wishful thinking!
      { count++ }
END   { print count }
Run Code Online (Sandbox Code Playgroud)

包装器脚本无法检查awk运行时是否存在文件,因为它们在检查和awk之间可能会消失,然后尝试打开它们,即它是竞争条件.(这也是在awk中检查然后打开的竞争条件,虽然时间更紧)

error-handling awk gawk race-condition

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

gawk/awk:getline的管道日期*有时*不起作用

我正在尝试将日期从一种格式转换为另一种格式:从例如"2005年10月29日"到2005-10-29.我有625个日期列表.我用Awk.

转换有效 - 大部分时间.Hovewer,有时转换根本不会发生,并且应该保持(转换)日期的变量仍未定义.

这总是发生在完全相同的行上.在那些奇怪的行的日期显式地(从Bash shell)运行"date"工作正常(日期被正确转换). - 这些行的文本内容不重要.

为什么会出现这种情况,以及如何修复脚本?
她是:

awk 'BEGIN { FS = "unused" } { 
  x = "undefined";
  "date \"+%Y-%m-%d\" -d " $1 | getline x ;
  print $1 " = " x
}' uBXr0r15.txt \
 > bug-out-3.txt
Run Code Online (Sandbox Code Playgroud)

如果要重现此问题:

  1. 下载此文件:uBXr0r15.txt.
  2. 运行Awk skript.
  3. 在bug-out-3.txt中搜索"undefined".
    ("undefined"在我的电脑上发现了122次.)

然后你可以再次运行脚本,并且(在我的计算机上)bug-out-3.txt保持不变 - 完全相同的日期未定义.

(Gawk 3.1.6版,Ubuntu 9.10.)

亲切的问候,马格努斯

bash awk pipe getline gawk

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

以awk模式更改正则表达式分隔符

是否可以将默认的正则表达式分隔符(斜杠)更改为其他字符?

我尝试使用sed语法来实现它,但它没有用.

$ gawk '\|bash| { print } ' backup.sh
gawk: |bash| { print }
gawk: ^ syntax error
Run Code Online (Sandbox Code Playgroud)

我正在尝试的正则表达式有很多斜线.逃离所有这些将使它变得丑陋和难以理解.我尝试将/更改为 但它不起作用.

TIA

regex awk gawk nawk

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

awk FPAT变量:工作

我已经能够从GAWKGNU页面了解到它可以使用FPAT变量处理数据中的分隔符,但我无法理解它是如何工作的.对于CSV文件,FPAT值为:

FPAT = "([^,]+)|(\"[^\"]+\")"
Run Code Online (Sandbox Code Playgroud)

使用数据:

abc,"pqr,mno"
Run Code Online (Sandbox Code Playgroud)

第一个分组表达式计算所有内容,即不是逗号,这应该"abc"是数据,然后第一次出现逗号时失败.现在我的问题是接下来会发生什么?由于第一个分组表达式失败,regexp将继续使用或条件逗号之后的字符?但是第一个分组表达式继续对逗号后的所有数据有效,因此它可能"pqr作为下一个数据?

regex awk gawk

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

使用GAWK的CSV文件中的时间戳到Epoch

希望使用GAWK将人类可读时间戳转换为CSV文件中的纪元/ Unix时间,以准备加载到MySQL数据库中.

数据示例:

{null};2013-11-26;Text & Device;Location;/file/path/to/;Tuesday, November 26 12:17 PM;1;1385845647
Run Code Online (Sandbox Code Playgroud)

希望在11月26日星期二下午12:17进入第6列,并转换为纪元时间进行存储.显示的所有时间都是EST格式.我意识到AWK是这个的工具,但似乎无法构建命令.目前有:

cat FILE_IN.CSV | awk 'BEGIN {FS=OFS=";"}{$6=strftime("%s")} {print}' 
Run Code Online (Sandbox Code Playgroud)

但是这会返回:

{null};2013-11-26;Text & Device;Location;/file/path/to/;1385848848;1;1385845647
Run Code Online (Sandbox Code Playgroud)

据推测,这意味着我正在调用当前的纪元时间(1385848848是执行时的当前纪元)而不是要求strftime转换字符串; 但我无法想象另一种方法.

gawk/ strftime将现有时间戳转换为纪元的正确语法是什么?

编辑:这个问题似乎与我如何在另一个命令中使用awk的输出松散相关

csv awk epoch gawk

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

如何跳过awk中的目录?

假设我有以下文件和目录结构:

$ tree
.
??? a
??? b
??? dir
    ??? c

1 directory, 3 files
Run Code Online (Sandbox Code Playgroud)

也就是说,两个文件ab一个dir dir,另一个文件c所在的位置.

我想用awk(GNU Awk 4.1.1,确切地)处理所有文件,所以我做这样的事情:

$ gawk '{print FILENAME; nextfile}' * */*
a
b
awk: cmd. line:1: warning: command line argument `dir' is a directory: skipped
dir/c
Run Code Online (Sandbox Code Playgroud)

一切都很好,但*也扩展到目录dirawk尝试处理它.

所以我想知道:有没有本地方法awk可以检查给定元素是否是一个文件,如果是,跳过它?也就是说,不用system()它.

我通过systemBEGINFILE中调用外部来使它工作:

$ gawk 'BEGINFILE{print FILENAME; if (system(" [ …
Run Code Online (Sandbox Code Playgroud)

awk gawk dir

6
推荐指数
2
解决办法
853
查看次数

将字符串直接拆分为数组

假设我想传递一个字符串,awk以便一旦我将其分割(在模式上),子字符串就成为关联数组的索引(而不是值).

像这样:

$ awk -v s="A:B:F:G" 'BEGIN{ # easy, but can these steps be combined?
                            split(s,temp,":")  # temp[1]="A",temp[2]="B"...
                            for (e in temp) arr[temp[e]] #arr["A"], arr["B"]...
                            for (e in arr) print e 
                            }'
A
B
F
G
Run Code Online (Sandbox Code Playgroud)

是否有一个awkism或gawkism,允许字符串s直接拆分为其组件,这些组件成为索引条目arr


原因是(更大的图片)我想要这样的东西(伪awk):

awk -v s="1,4,55" 'BEGIN{[arr to arr["1"],arr["5"],arr["55"]} $3 in arr {action}'
Run Code Online (Sandbox Code Playgroud)

arrays awk gawk

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

AWK/GAWK 性能

我有一个 8400 万行的 XML,正在 Red Hat Linux 中使用“gawk”进行处理。(好吧,有些人会建议使用其他工具而不是 GAWK,但我的 XML 没有多行标记或任何其他特性,使 GAWK 不是这项工作的良好选择。)

我关心的是性能。

我最初的 AWK 脚本是这样的:

# Test_1.awk
BEGIN {FS = "<|:|=";}
{
if ($3 == "SubNetwork id")
    {
    # do something
    }
}
END {
# print something
}
Run Code Online (Sandbox Code Playgroud)

每行进行一次 8400 万次字符串比较。

我注意到“SubNetwork id”仅在该行中有 4 个字段 (NF=4) 时出现,因此我更改了脚本以减少字符串比较:

# Test_2.awk
BEGIN {FS = "<|:|=";}
{
if (NF == 4)
    {
    if ($3 == "SubNetwork id")
        {
        # do something
        }
    }
}
END {
# print something
} …
Run Code Online (Sandbox Code Playgroud)

performance awk gawk

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

是否有 INT_MIN 和 INT_MAX 的 awk 等价物?

在 C 和 Java 中,定义了代表整数可以容纳的最大值和最小值的常量。

中有这样的常数awk吗?如果有,他们的名字是什么?

AWK手册表明AWK可以支持整数运算与任意精度的-M,但我想知道关于整数边界当我们指定-M

awk gawk

6
推荐指数
2
解决办法
948
查看次数

标签 统计

awk ×10

gawk ×10

arrays ×2

regex ×2

bash ×1

csv ×1

dir ×1

epoch ×1

error-handling ×1

getline ×1

mawk ×1

nawk ×1

performance ×1

pipe ×1

race-condition ×1