【问题标题】:How can I differentiate between $1 as a shell variable and $1 as an awk variable?如何区分 $1 作为 shell 变量和 $1 作为 awk 变量?
【发布时间】:2018-05-06 15:34:42
【问题描述】:

当我将命令行参数传递给我的脚本时,我们必须使用 $1、$2 等来访问该值,同样,当我们使用 awk 时,我们可以将文件的列称为 $1、$2 等。 ,

 #!/bin/bash
 cat $1 | awk '$1 > 20'
  • 假设我已将文件名作为命令行参数传递,我们可以使用 $1 引用该参数。
  • 假设文件内容如下。

     20 A         
     10 B   
     5  D  
     13 K
     50 C
    

我怎么知道,当阅读这段代码时,它会访问命令行$1——输入文件名——还是cat输出的第一列?

【问题讨论】:

  • 提供您的问题的更多细节
  • @anubhava,是的,当然
  • @NagaVenkateshGavini 你要澄清这个问题吗?
  • 它们是两个不同的$1,一个是shell位置参数编号1,另一个$1是AWK第一个字段。
  • @DiegoTorresMilano 是的,它们是不同的,但是当我编写脚本并在同一个脚本中使用 awk 时,我该如何区分。

标签: linux bash shell awk command-line


【解决方案1】:

这里有一个简单的规则:shell 不对单引号字符串执行任何扩展。

在其他情况下也是如此:echo '$1' 打印确切的字符串 $1

因此,在以下代码中(为了正确性而进行了编辑——shell 变量周围缺少双引号会导致错误,并且使用cat 会导致不必要的低效):

awk '$1 > 20' <"$1"

...$1 &gt; 20 被 shell 视为字面量,仅由 awk 解析为代码,"$1" 位于双引号中,由 shell 扩展。

【讨论】:

  • 因此,如果脚本的第一个参数是“myfile.txt”,这将运行 awk 脚本$1 &gt; 20,输入来自 myfile.txt。相反,如果您将双引号和单引号交换为 awk "$1 &gt; 20" &lt;'$1',它将运行 awk 脚本 myfile.txt &gt; 20(这没有任何意义),并尝试从字面上名为“$1”的文件中读取输入(这也没有多大意义)。基本上,这一切都取决于事物的引用方式。
  • @charles Duffy,现在如果我想将 20 作为第二个命令行参数,现在我必须将我的代码设为 [awk '$1 > "$2" '
  • 这几乎肯定是不正确的引用,但我们无法猜测您实际上想说什么。也许像awk -v limit="$2" '$1 &gt; limit' &lt;"$1" 之类的东西(虽然这里的重定向实际上是多余的;像大多数面向文件的命令一样,Awk 接受要读取的输入文件列表)。
  • @NagaVenkateshGavini,如果这是你的问题,那么有一个单独的问题:How do I use shell variables in an awk script?
【解决方案2】:

在使用 awk 时是否还有其他方式来表示列 在 shell 脚本中?

您可以使用变量来表示它们,例如

awk '{for(i=1;i<NF;i++){print $i}}' file

这里NF 是字段的总数(可能被视为列)。由于i 在循环中获得不同的值,$i 将扩展到单独的列,如$1$2 等.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    • 2015-03-11
    • 1970-01-01
    相关资源
    最近更新 更多