试图了解 gawk 与 awk 两个函数之间的区别?什么时候使用 gawk 与 awk?或者它们在使用方面是否相同?
另外,可以举个例子吗?
如何跳过文本文件 (input.txt) 中的前 6 行/行并使用 awk 处理其余部分?我的 awk 脚本(program.awk)的格式是:
BEGIN {
}
{
process here
}
END {
}
Run Code Online (Sandbox Code Playgroud)
我的文本文件是这样的:
0
3
5
0.1 4.3
2.0 1.5
1.5 3.0
0.3 3.3
1.5 2.1
.
.
.
Run Code Online (Sandbox Code Playgroud)
我想从以下位置开始处理文件:
0.3 3.3
1.5 2.1
.
.
.
Run Code Online (Sandbox Code Playgroud) 这里需要的是在给定年份范围(1987 年到 2017 年)的情况下生成六个日期的命令。例如:
12/10/1987
30/04/1998
22/02/2014
17/08/2017
19/07/2011
14/05/2004
Run Code Online (Sandbox Code Playgroud)
如何它可以做,用sed,gawk等?
我有一个str.txt包含以下示例记录的文件。
31,2713810299,1,11-Aug-15 19:52:10
32,2713810833,1,11-Aug-15 21:36:18
Run Code Online (Sandbox Code Playgroud)
现在我想用 awk 打印输出,如下所示。
cat str.txt|awk -F, '{print substr("$4",1,9)}' -
Run Code Online (Sandbox Code Playgroud)
输出应该是:
'11-Aug-15'
'11-Aug-15'
Run Code Online (Sandbox Code Playgroud) 我正在尝试从字符串中提取两个数值并使用awk(gawk是我专门使用的)将它们分配给变量。我想将 tmux 版本字符串中的主要和次要版本号提取到awk变量中,例如:
tmux 2.8; maj == 2和min == 8tmux 1.9a; maj == 1和min == 9tmux 2.10; maj == 2和min == 10假设我的输入来自tmux -V标准输入,我目前有以下内容:
tmux -V | awk '{
maj = +gensub(/([0-9]+)\..*/, "\\1", "g", $2);
min = +gensub(/.*\.([0-9]+).*/, "\\1", "g", $2);
# ...do something with maj and min...
}'
Run Code Online (Sandbox Code Playgroud)
这是有效的,但正如 tmux 的许多用户所知,if-shell在.tmux.conf文件中使用(我希望使用这些东西的地方)很容易导致配置文件中的行非常长,所以我想知道是否有办法将这两个变量结合起来分配到一个语句中以节省空间……或以任何其他方式从输入中收集这两个变量并节省空间。 …
是否可以使用gawk's-i inplace选项并将内容打印到stdout?
例如,如果我想更新一个文件,并且如果有任何更改,则将文件名和更改后的行打印到stderr我可以执行以下操作
find -type f -name 'myfiles' -exec gawk -i inplace '{if(gsub(/pat/, "repl")) { print FILENAME > "/proc/self/fd/2" ; print > "/proc/self/fd/2"; } print;}' {} +
Run Code Online (Sandbox Code Playgroud)
但是有没有办法使用stdout,或者更简洁的方式将该块打印到备用流?
中是否有一个常量变量awk,用于存储今天的日期?如果没有,有没有办法可以存储今天的日期以供日常使用?
假设我们有以下文件:
boo,foo,2016-08-30
foo,boo,2016-07-31
Run Code Online (Sandbox Code Playgroud)
我需要将$3文件中的日期与今天的日期进行比较,无论它是什么。
即下面的脚本:
awk -F, '{if($3>"2015-08-23"){print $0}}'
Run Code Online (Sandbox Code Playgroud)
2015-08-23当前日期将在哪里更改。
考虑以下文件:
file1:
boo,8,1024
foo,7,2048
Run Code Online (Sandbox Code Playgroud)
file2:
foo,0,24,154
noo,0,10,561
Run Code Online (Sandbox Code Playgroud)
file3:
24,154,7,1024,0
Run Code Online (Sandbox Code Playgroud)
我需要的是去File1并检查是否$2==7;如果为真,取$1,$2和$3来自File1 ; 现在我必须比较$1来自File1 是否等于$1来自File2;如果为真,我必须从File1中不存在的File2取$3和,然后我必须转到File3并检查from File3是否等于from File2,以及from File3等于from File2;如果是,那么我必须检查是否来自File1$4$1$3$2$4$2等于$3from File3,那么如果这个条件为真,我必须比较$3from File1和$4from File3,如果$3from File1大于$4from File3。
我尝试了以下脚本: …
我发现如果我们使用awk 0 inputfile,它不会打印任何内容,原因0是条件错误。
如果我们使用awk 1 inputfile,它会将所有内容打印为1awk 解释的每一行都为真。
如果我们使用awk any_string inputfile,它不会打印任何内容,因为所有 awk 变量都初始化为零,因此为 false。
但是如果我们使用awk any_integer inputfile,它会变成真的并打印文件的每一行,我可以知道是什么原因吗?
不过,我在GNUawk手册中找不到对此的解释。
来自 Gawk 的手册:
当一个规则中的 awk 语句很短时,您可能希望将多个语句放在一行中。这是通过用分号 (';') 分隔语句来实现的。这也适用于规则本身。因此,本节开头显示的程序也可以这样编写:
Run Code Online (Sandbox Code Playgroud)/12/ { print $0 } ; /21/ { print $0 }注意:在原始 awk 语言中,要求声明同一行的规则必须用分号分隔;添加它是为了与操作中的语句处理保持一致。
但是我从/sf/ask/1418400861/看到
awk '$2=="no"{$3="N/A"}1' file
Run Code Online (Sandbox Code Playgroud)
不是$2=="no"{$3="N/A"}和1两个语句吗?为什么它们没有被任何东西隔开?
谢谢。