首页 > 解决方案 > 如何将输入文件名传递给 awk 脚本

问题描述

我在名为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

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

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

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

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

我试过的这个命令失败了

./code.sh test

标签: shellunixawk

解决方案


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

OP代码中的修复:

  • 同样作为一项改进,我已经从 OP 的代码中删除了BEGIN部分END,因为在 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 的过度使用。


推荐阅读