【问题标题】:How to use the max number for every line in awk?如何使用awk中每一行的最大数量?
【发布时间】:2017-04-04 21:41:25
【问题描述】:

这是一个简单的 awk 脚本 ma​​x1.awk,用于获取所有行的最大长度。

#! /usr/bin/awk 
BEGIN {max =0 }
{
    if (length($0) > max) { max = length($0)}
}
END {print max}

它可以通过一些测试文件获得最大长度。

awk -f max1.awk  test_file

现在将所有 awk 脚本移动到 BEGIN 块中,如下所示 ma​​x2.awk

#! /usr/bin/awk 
BEGIN {max =0;
    if (length($0) > max) { max = length($0)};
    print max}

为什么不能用 awk -f max2.awk test_file 打印 test_file 的最大长度?
我如何使用每行的最大数量?

【问题讨论】:

  • 您不喜欢max1.awk 的哪些方面?你在这里的真正目标是什么?正如 Kent 所解释的,BEGIN 块在从文件中读取任何行之前执行($0 在这种情况下是空字符串)。除了BEGIN 块不是必需的(因为max 的初始值已经默认为0)之外,max1.awk 是完全正确的。
  • 另外,已经有一个命令可以做到这一点...wc -L < test_file

标签: linux awk


【解决方案1】:

BEGIN 块将在 awk 读取行之前处理,如果您的脚本只有 BEGIN 块,则不会加载任何行,只有 BEGIN 块被 awk 执行。

因此,您的最大长度计算未完成。

例如

kent$  awk 'BEGIN{print length($0)}'<<<"foo"
0 #here we get 0 instead of 3, because default var in awk is "". 
  #If you print NR, it is 0 as well.

【讨论】:

  • 如何使用每行的最大数量?
  • @it_is_a_literature 从BEGIN{}取出来
【解决方案2】:

您可以通过getline 逐行读取文件。如果您在 BEGIN 块中使用它并重复,只要它返回 1,您就可以处理整个输入流。 在 if 声明之前添加这一行:

while ( getline > 0 )

整个脚本如下:

BEGIN {max =0
    while ( getline > 0 )  
       if (length($0) > max) { max = length($0)}
    print max}

【讨论】:

    猜你喜欢
    • 2017-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-07
    • 2013-03-09
    • 2017-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多