【问题标题】:Using ARGV to get user input in awk script使用 ARGV 在 awk 脚本中获取用户输入
【发布时间】:2014-10-19 08:34:20
【问题描述】:

我知道 ARGV[i] 可用于存储用户输入。但是,我想在 awk 脚本中使用它并获取 ARGV[i] 来比较另一个文本文件中的字段。如果 ARGV[i] 匹配该字段或该字段包含 ARGV[i] 这是用户输入,那么我想返回该行的其他字段。 假设我有一个文件,testing.txt

123123123:Walter White:1:2:3:4
123123124:Jesse Pinkman:1:3:4:1

这是我的 awk 脚本,awkScript.awk

 #!/usr/bin/awk -f
    BEGIN{FS = ":"; print "ENTER A NAME: "}
    {
        for (i = 1; i < ARGC; i++)
        {   
            if ($2 ~ /'ARGV[i]'/)
            {
                print "Member ID: " $1
            }
        }
    }

它只是打印 ENTER A NAME: 当我执行脚本文件时。它甚至没有从用户那里得到输入。

【问题讨论】:

  • ARGV 不能用于交互式内容。它是 shell 将其交给程序时的完整命令行,也就是您在 /proc/PID/cmdline 下找到的内容。在您的情况下,它看起来像yourprogram 'Walter White' datafile。如果您想获得用户输入,可以查看 [this question][1]。 [1]:stackoverflow.com/questions/12907238/get-the-user-input-in-awk
  • 这将更适合纯 *nix 解决方案。

标签: unix awk argv


【解决方案1】:

来自 awk 手册

ARGV is an array of command line arguments

这是调用 awk 脚本时传递的参数列表。

你可能想要类似的东西

    $echo 'ENTER A NAME'
    $read Name
    Jesse Pinkman
    $awk -v name="$Name" -F: '$2=name{print $1}' filename   
    123123123
    123123124

这里-v 选项在awk 脚本中创建一个名为name 的变量,并将$Name 变量的值从shell 分配给名称

$2=name{print $1} $2=name 选择$2name 的所有行并打印第一列

【讨论】:

    【解决方案2】:

    不确定你在想什么使用 ARGV[] 但这是在 awk 中做你想做的事情的一种方法:

    $ awk 'BEGIN{FS=":"; msg="ENTER A NAME:"; print msg} NR==FNR{a[$2]=$0; next} $0 in a{print a[$0]} {print msg}' file -
    ENTER A NAME:
    Jesse Pinkman
    123123124:Jesse Pinkman:1:3:4:1
    ENTER A NAME:
    Walter White
    123123123:Walter White:1:2:3:4
    ENTER A NAME:
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多