shell - 如何将输入文件名传递给 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
解决方案
您应该$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 的过度使用。
推荐阅读
- javascript - 无法使用 getDateTimeInstance 函数获取日期格式
- javascript - 将日期范围数组排序为组,其中每个组没有重叠范围(Javascript)
- vb.net - 我无法在 vb 2017 中定义列表?
- php - 即使设置了标头也会出现 CORS 错误 - 仅在某些调用中
- r - 使用 R 对两个数据帧进行多项操作
- vue.js - 如何在 Vue 中动态操作 DOM 并检测用户操作系统
- flutter - 使用上下文调用的 Mediaquery.of 不包含 mediaquery 错误
- python - 使用值在嵌套字典中获取与该值对应的键,该字典中每个键都有一个列表
- xml - XSLT 1.0 多个模板匹配块
- c# - 未验证最小起订量方法调用