【问题标题】:How to pass awk as an argument of another function如何将 awk 作为另一个函数的参数传递
【发布时间】:2018-08-20 07:21:29
【问题描述】:

levenshtein 是一个获取两个参数并计算它们之间距离的函数:我想使用awk 删除两个参数的第一项,然后将它们提供给levenshtien 函数,但它不起作用:

levenshtein  awk '{$1=""; print}' text1  awk '{$1=""; print}' text2

顺便说一句,我无法通过此链接解决我的问题 Bash: pass a function as parameter

我对以下内容不感兴趣!

awk '{$1=""; print}' text1 > txt1
awk '{$1=""; print}' text2 > txt2
levenshtein txt1 txt2

【问题讨论】:

  • 你没有显示任何输入,所以我可能是错的,但我怀疑你可以使用 awk '{print $2}' text1 text2 而不是 awk '{$1=""; print}' text1 awk '{$1=""; print}' text2 的任何变体。如果您 edit 您的问题包括简洁、可测试的样本输入和预期输出,我们可以为您提供更多帮助。

标签: bash awk


【解决方案1】:

如果有多个参数,您可能还需要使用 xargs

https://unix.stackexchange.com/a/387078/121634

例子

kubectl get all --all-namespaces | grep Terminating |  awk 'NR>1 {print $1 " " $2}'  | xargs -n2  sh -c 'kubectl -
n $1 delete $2 --grace-period=0 --force' sh

【讨论】:

    【解决方案2】:

    您可以使用称为Process substitution 的shell 功能,从而将进程的输出用作shell 脚本或shell 函数的参数。

    cmets 中的 Vinicius Plaacco 已经展示了这在您的情况下如何发挥作用

     levenshtein <(awk '{$1=""; print}' text1) <(awk '{$1=""; print}' text2)
    

    请注意,这仅适用于具有命名管道或类似机制的系统,包括所有 Linux 系统。

    一些细节

    此机制的工作原理如下。系统会创建一个特殊文件,该文件在 &lt;( command ) 参数中累积命令 command 的输出。此文件的名称作为levenshtein 脚本的位置参数给出。

    另一个帖子建议使用Command substitution$( command ),其中命令command 的整个输出用于构建levenshtein 的参数列表。

    例如,如果文件 text1.txt 包含这些行

    1 love
    2 love
    3 love 
    ...
    

    然后levenshtein &lt;( awk '{print $1} text1' ) 将创建一个特殊文件/dev/fd/nn 并调用`

    levenshtein /dev/fd/nn
    

    文件的内容将是awk '{print $1}' text1 的输出。

    使用命令替换levenshtein $( awk '{print $1}' text1) 会将输出拆分为用空格分隔的单个标记并执行

    levenshtein love love love
    

    【讨论】:

    • 好建议。解释进程替换和命令替换之间的区别可能很方便(Jorge 的回答)。
    【解决方案3】:

    您可以在 bash 中使用 $() 将命令的标准输出用作另一个命令的参数。这称为command substitution

    levenshtein $(awk '{$1=""; print}' text1) $(awk '{$1=""; print}' text2)
    

    这与进程替换(在 Dimitri 的回答中)之间的区别在于,如果您的程序不期望文件而是文本,您将使用 $()。如果程序需要一个文件路径,那么您最好使用&lt;()。示例:

    cat <(echo hello)
    

    如果您希望单个 awk 输出生成多个参数,则需要使用 xargs

    awk '{$1=""; print}' text1 text2 | xargs -n2 levenshtein
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-09
      • 2013-04-13
      • 2019-08-19
      • 1970-01-01
      • 2023-01-12
      • 2017-08-07
      相关资源
      最近更新 更多