如何将awk作为另一个函数的参数传递

时间:2018-03-12 09:58:12

标签: bash awk

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

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

BTW我无法通过此链接解决我的问题 Bash: pass a function as parameter

我对以下内容不感兴趣!

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

3 个答案:

答案 0 :(得分:4)

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

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

这个和流程替换之间的区别(在Dimitri的回答中)是,如果你的prorgam不期望文件而是文本,你会使用$()。如果程序需要文件路径,那么您最好使用<()。例如:

cat <(echo hello)

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

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

答案 1 :(得分:2)

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

Vinicius Placco在评论中已经说明了这可以在你的案例中发挥作用

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

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

一些细节

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

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

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

1 love
2 love
3 love 
...

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

levenshtein /dev/fd/nn

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

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

levenshtein love love love

答案 2 :(得分: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