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
答案 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