我希望能够将数组变量传递给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。那么,有没有任何版本awk(gawk,mawk或其他任何东西),可以接受来自一个数组-v开关?
我知道我可以解决这个问题并且可以很容易地想到这样做的方法,我只是想知道是否有任何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中检查然后打开的竞争条件,虽然时间更紧)
我正在尝试将日期从一种格式转换为另一种格式:从例如"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)
如果要重现此问题:
然后你可以再次运行脚本,并且(在我的计算机上)bug-out-3.txt保持不变 - 完全相同的日期未定义.
(Gawk 3.1.6版,Ubuntu 9.10.)
亲切的问候,马格努斯
是否可以将默认的正则表达式分隔符(斜杠)更改为其他字符?
我尝试使用sed语法来实现它,但它没有用.
$ gawk '\|bash| { print } ' backup.sh
gawk: |bash| { print }
gawk: ^ syntax error
Run Code Online (Sandbox Code Playgroud)
我正在尝试的正则表达式有很多斜线.逃离所有这些将使它变得丑陋和难以理解.我尝试将/更改为 但它不起作用.
TIA
我已经能够从GAWK的GNU页面了解到它可以使用FPAT变量处理数据中的分隔符,但我无法理解它是如何工作的.对于CSV文件,FPAT值为:
FPAT = "([^,]+)|(\"[^\"]+\")"
Run Code Online (Sandbox Code Playgroud)
使用数据:
abc,"pqr,mno"
Run Code Online (Sandbox Code Playgroud)
第一个分组表达式计算所有内容,即不是逗号,这应该"abc"是数据,然后第一次出现逗号时失败.现在我的问题是接下来会发生什么?由于第一个分组表达式失败,regexp将继续使用或条件逗号之后的字符?但是第一个分组表达式继续对逗号后的所有数据有效,因此它可能"pqr作为下一个数据?
希望使用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的输出松散相关?
假设我有以下文件和目录结构:
$ tree
.
??? a
??? b
??? dir
??? c
1 directory, 3 files
Run Code Online (Sandbox Code Playgroud)
也就是说,两个文件a和b一个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)
一切都很好,但*也扩展到目录dir并awk尝试处理它.
所以我想知道:有没有本地方法awk可以检查给定元素是否是一个文件,如果是,跳过它?也就是说,不用system()它.
我通过system在BEGINFILE中调用外部来使它工作:
$ gawk 'BEGINFILE{print FILENAME; if (system(" [ …Run Code Online (Sandbox Code Playgroud) 假设我想传递一个字符串,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) 我有一个 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) 在 C 和 Java 中,定义了代表整数可以容纳的最大值和最小值的常量。
中有这样的常数awk吗?如果有,他们的名字是什么?
在AWK手册表明AWK可以支持整数运算与任意精度的-M,但我想知道关于整数边界当我们不指定-M。