如何将Bash命令输出管道传至双参数Levenshtein距离函数
解决Bash中向Levenshtein函数传递管道输入的两个句子参数问题
首先,你的核心问题是如何将awk输出的每行两个带空格的句子,正确作为两个参数传递给需要位置参数的levenshtein函数。之前尝试从标准输入直接读取两个参数的方法失效,是因为$(</dev/stdin)会一次性读取全部输入内容,无法区分两个独立的句子参数,而且句子中的空格会导致参数拆分混乱。
下面提供两种可靠的解决方案:
方法一:使用自定义分隔符+read命令(推荐)
这种方法通过awk将两个句子用一个不会出现在文本中的分隔符(比如|)连接,再用read命令按分隔符拆分,确保每个句子作为完整的参数传递:
- 先确保你的
levenshtein函数已经在当前shell环境中定义(比如直接粘贴到终端,或者放在脚本开头)。 - 执行以下命令:
awk -F '\t' '{if ($1>0) print $2 "|" $3}' data.test | while IFS="|" read -r str1 str2; do levenshtein "$str1" "$str2" done
原理说明:
awk部分:用制表符分隔字段,过滤首列>0的行,将第二、第三字段用|拼接输出(避免句子内的空格干扰)。while read循环:设置IFS="|"(输入字段分隔符),将每行内容拆分为str1和str2两个变量,用双引号包裹传递给levenshtein,确保句子内的空格被保留为参数的一部分。
方法二:通过awk输出带引号的参数串
如果偏好这种方式,可以让awk将每个句子用双引号包裹,再通过read和函数调用传递:
awk -F '\t' '{if ($1>0) printf "\"%s\" \"%s\"\n", $2, $3}' data.test | while read -r args; do levenshtein $args done
原理说明:
awk用printf输出带双引号的两个句子,确保每个句子作为一个整体字符串。read读取整行的参数串,直接传递给levenshtein时,shell会自动解析双引号,将两个句子识别为独立参数。
为什么之前的方法失效?
你尝试的declare input1=${1:-$(</dev/stdin)}; declare input2=${2:-$(</dev/stdin)}存在两个问题:
$(</dev/stdin)会一次性读取全部标准输入内容,而不是分两次读取两个参数,当awk输出多行时,还会包含换行符。- 即使只有一行输入,句子中的空格会被shell拆分为多个参数,无法正确识别为两个完整的句子。
内容的提问来源于stack exchange,提问作者Astrid
相关产品推荐
相关产品推荐

