【问题标题】:AWK script command line arguments and file inputAWK 脚本命令行参数和文件输入
【发布时间】:2020-08-28 19:54:53
【问题描述】:
#!/usr/bin/awk -f

BEGIN{
    print ARGV[1]
}
{
    print $1, $3
}
END{
    print "Done"
}

我需要同时拥有命令行参数和文件作为输入。 我尝试了以下方法并得到了显示的错误:

cat users.txt |./temp.awk 3
3
awk: ./temp.awk:4: fatal: cannot open file `3' for reading (No such file or directory)

显示了命令行参数,但我似乎找不到读取文件的方法。

谢谢。

【问题讨论】:

  • awk 需要一个文件名而不是 3。如果你需要传递一个参数,你可以使用 v=3 代替,然后只报告值。
  • @karakfa 可以在不使用 v = 3 的情况下完成吗?感谢您的回复。
  • 否,否则awk 将需要一个文件名。只有x=y 类型被视为变量声明。
  • 将 awk 脚本放入 bash 脚本中。

标签: unix awk


【解决方案1】:

在这种情况下,您可以在BEGIN 块内设置ARGV[1]ARGC

BEGIN {
    print ARGV[1]
    # Empty ARGV[1] so that it is not treated as a filename
    ARGV[1]=""
}
{
    print $1, $3
}
END {
    print "Done"
}

man 1p awk:

ARGCARGV 数组中的元素个数。

ARGV 一个命令行参数数组,不包括选项和程序参数,编号从零到ARGC−1。

ARGV 中的参数可以修改或添加; ARGC 可以更改。当每个输入文件结束时,awk 将把ARGV 的下一个非空元素,直到ARGC−1 的当前值,包括在内,作为下一个输入文件的名称。因此,将ARGV 的元素设置为null 意味着它不应被视为输入文件。名称“”表示标准输入。如果参数与赋值操作数的格式匹配,则该参数应被视为赋值而不是文件参数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-22
    • 2016-01-17
    • 1970-01-01
    • 1970-01-01
    • 2011-04-17
    • 1970-01-01
    • 2018-08-28
    相关资源
    最近更新 更多