【问题标题】:How to pass the input file name to an awk script如何将输入文件名传递给 awk 脚本
【发布时间】:2020-09-06 15:49:53
【问题描述】:

我在名为 code.sh 的文件中编写了一个简单的 awk 命令,用于从输入文件 命名为 test按数字排序并显示在命令行上

输入文件测试

23
34
45
56
6
76
5
43
22
45
67
445
55
33
44
44
88
76
54
0
9
8
7
66

代码写在code.sh如下图

awk '
    BEGIN{
    }
    {
        if($1 % 2 == 0){
            print($1);
        }
    }
    END{
    }
' test | sort -n

在命令提示符下,我正在执行以下代码来运行脚本

./code.sh

上面的代码工作得很好,我得到了预期的输出。

但在代码中,我在代码中提供了输入文件的名称(在本例中,输入文件名为 test)。

但我想要的是在命令行中提供输入文件名。

我认为这是解决方案之一。

BEGIN{
}
{
    if($1 % 2 == 0){
        print($1);
    }
}
END{
}

在命令行中,我执行任务的代码是

awk -f code.sh test | sort -n

但在这种情况下,我必须在脚本之外的命令行中编写 sort 命令。但我想在 code.sh中编写所有代码(仅选择偶数的 awk 命令和使用管道 | 对 awk 脚本的输出进行排序的排序命令) > 文件并在命令行参数中提供输入文件 test

在 HackerRank 中,我执行了以下代码,这实际上是我的要求,使用自定义输入并运行脚本,我得到了预期的输出。但我不知道 HackerRank 平台使用什么命令来运行脚本

awk '
BEGIN{
}
{
    if($1 % 2 == 0){
        print($1);
    }
}
END{
} ' | sort -n

现在我想在我自己机器的命令行中提供输入文件test来执行上述脚本。

我试过的这个命令失败了

./code.sh test

【问题讨论】:

  • 如果存在这样的标签,您应该用“hackerrank”标记您的问题,或者在有关“hackerrank”的论坛上发布您的问题,或者联系任何支持该标签的人。

标签: shell unix awk


【解决方案1】:

您应该在脚本中使用$1,并确保将其作为 Input_file 传递给awk 脚本。像下面这样的东西应该可以解决问题(因为缺少预期的输出样本没有测试它)。

OP 代码中的修复:

  • 另外,作为一项改进,我已从 OP 的代码中删除了 BEGINEND 部分,因为在 OP 代码的这些部分中没有发生任何事情。
  • 然后要找到偶数行,应该使用FNR%2==0 条件,其中FNR 表示当前行号。

cat script.ksh
val=$1
awk '
{
  if(FNR % 2 == 0){
    print($1);
  }
}
' "$val" | sort -n

以下是如何运行它:

./script.ksh Input_file

注意:您还可以在上面的脚本中添加一个usage 选项(它告诉人们如果他们忘记传递任何变量,他们应该知道它实际上是如何运行的),把它作为 OP 的过度使用。

【讨论】:

【解决方案2】:

把这个放到code.sh:

#!/usr/bin/env bash

awk '
    script
' "${@:--}" | sort

"${@:--}" 语法是这样的,它会从文件或管道中读取输入。显然用您的实际 awk 脚本替换 script

【讨论】:

    【解决方案3】:

    如果您使用 GNU awk,则不需要 sort

    # evens.awk
    $1 % 2 == 0 {evens[NR] = $1}
    END {
        PROCINFO["sorted_in"] = "@val_num_asc"
        for (i in evens)
            print evens[i]
    }
    

    然后

    gawk -f evens.awk test
    

    PROCINFO["sorted_in"] = "@val_num_asc" 行指示 awk 在使用 for 迭代时按数组值对数组进行数字排序。

    参考:

    【讨论】:

      【解决方案4】:

      您也可以在awk 脚本中嵌入排序

      awk '!($1%2){print | "sort -n"}' "$1"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-10-07
        • 2012-01-23
        • 2018-04-04
        • 2022-01-23
        • 2020-07-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多