【问题标题】:Pass Variable in awk and match it with $1在 awk 中传递变量并将其与 $1 匹配
【发布时间】:2020-08-27 21:59:30
【问题描述】:

我的要求是根据第一个字段拆分文件。 我的文件看起来像这样:

aaa|12345
bbb|45679
aaa|334564
ccc|qewqw

现在我的 awk 命令可以正常工作,并根据第一个字段值拆分文件。

awk -F\| '{f=($1); print $2 > f}' /myfile 

结果:文件名 aaa 包含以下行:

12345
334564

现在,我想让它输入驱动,即从一个脚本中,我将值aaa 输入到这个 awk 命令,它将与$1 匹配,并像上面一样创建文件。我尝试使用 awk -v 将值作为输入,但它没有按照我想要的方式工作。 任何帮助将不胜感激。

提前致谢。

【问题讨论】:

  • 这能满足您的需求吗?:stackoverflow.com/questions/19075671/…
  • “不工作”是什么意思?你能显示代码和错误信息吗?
  • 我尝试了这些选项,但问题是它没有正确匹配。我的意思是如果我传递一个值'v',整个文件内容将保存在我不想要的值'v'下。 @詹姆斯布朗
  • 如果您没有显示代码,则无法告诉您您做错了什么。
  • 这是我尝试做的:awk -v "var=$input_value" -F\| '{f=($var);打印 $2 > f}' /myfile 。但是在这里我不确定如何将 $1 值与 var 进行比较,结果整个文件内容都移到了 var 中。

标签: unix awk


【解决方案1】:

像这样?:

$ awk -v f=aaa -F\| 'f==$1{print $2 > f}' file
$ ls
aaa file
$ cat aaa
12345
334564

解释:

$ awk -v f=aaa -F\| '     # set input field separator and var f="aaa"
f==$1 {                   # if f ie. "aaa" equals to first field value
    print $2 > f          # write second field value to file f ie. "aaa"
}' file

【讨论】:

  • 您能否解释一下,比较 $1 和 aaa 的位置,并且在此代码中仅检索与 $1=aaa 对应的值,对不起,但我是新手,所以我可能会问一些基本问题。
  • -v f=aaa 将字符串 aaa 传递给变量 f$1~f 是匹配的,现在我早上喝了咖啡,我发现它有问题,你应该使用f==$1,我会修复它。
【解决方案2】:
awk -v var=$input_value -F\| '{print $2 > var}' myfile

在您的 cmets 代码中,问题在于 f=($var)。我想你想要f=var

【讨论】:

    【解决方案3】:
    cat file | awk -v inp=aaa -F\| '$1 ~ inp { print $2 > inp }'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-09
      • 2023-03-08
      • 2014-03-11
      相关资源
      最近更新 更多