如何将输入文件名传递给awk脚本

3
我已经在名为code.sh的文件中编写了一个简单的awk命令,用于从名为test的输入文件中查找所有偶数,并对它们进行数字排序并在命令行上显示。
输入文件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命令和sort命令),并在命令行参数中提供输入文件test
在HackerRank中,我执行了以下代码,这实际上是我的要求,并使用自定义输入运行了脚本,我得到了预期的输出。但我不知道HackerRank平台正在使用哪个命令来运行脚本。
awk '
BEGIN{
}
{
    if($1 % 2 == 0){
        print($1);
    }
}
END{
} ' | sort -n

现在我想在自己的机器上通过命令行提供输入文件test来执行以上脚本。
我尝试过的命令失败了。
./code.sh test

听起来你应该给你的问题打上“hackerrank”的标签,如果有这样的标签存在的话,或者在关于“hackerrank”的论坛上发布你的问题,或者联系支持“hackerrank”的人。 - undefined
4个回答

3

您应该在脚本中使用$1,并确保将其作为输入传递给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选项(告诉人们,如果他们忘记传递任何变量,他们应该知道它实际上是如何运行的),这在此处留作过度。


2
或者使用awk '....' $@ | sort -n来允许多个文件输入。祝大家好运。 - undefined
让我们在聊天中继续这个讨论。 - user14016325

2
把这段代码放在code.sh文件中:
#!/usr/bin/env bash

awk '
    script
' "${@:--}" | sort
< p > "${@:--}" 语法是为了从文件或管道中读取输入。显然,将 script 替换为您实际的awk脚本。


1

1

你也可以在 awk 脚本中嵌入排序功能

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接