热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

将输出管道连接到具有多个输入的bash功能

如何解决《将输出管道连接到具有多个输入的bash功能》经验,为你挑选了1个好方法。

这是我要尝试做的事情:我想使用bash测量两根琴弦之间的Levensthein距离。我在这里找到了LD的实现。

现在,假设我有一些玩具数据,例如:

1    The brown fox jumped    The green fox jumped
0    The red fox jumped    The green fox jumped
1    The gray fox jumped    The green fox jumped

并说它存储在中data.test

然后,我通过一个简单的awk命令将其过滤掉,1以此类推:

awk -F '\t' '{if ($1>0) print $2,t,$3}' data.test

然后,此简单命令的第一个输出将是:

The brown fox jumped    The green fox jumped

现在,我想通过将输出直接管道传递到此函数(从以上链接中提取)来测量这两个句子之间的Levensthein距离:

function levenshtein {
    if (( $# != 2 )); then
        echo "Usage: $0 word1 word2" >&2
    elif (( ${#1} <${#2} )); then
        levenshtein "$2" "$1"
    else
        local str1len=${#1}
        local str2len=${#2}
        local d

        for i in $( seq 0 $(( (str1len+1)*(str2len+1) )) ); do
            d[i]=0
        done

        for i in $( seq 0 $str1len );   do
            d[i+0*str1len]=$i
        done

        for j in $( seq 0 $str2len );   do
            d[0+j*(str1len+1)]=$j
        done

        for j in $( seq 1 $str2len ); do
            for i in $( seq 1 $str1len ); do
                [ "${1:i-1:1}" = "${2:j-1:1}" ] && local cost=0 || local cost=1
                del=$(( d[(i-1)+str1len*j]+1 ))
                ins=$(( d[i+str1len*(j-1)]+1 ))
                alt=$(( d[(i-1)+str1len*(j-1)]+cost ))
                d[i+str1len*j]=$( echo -e "$del\n$ins\n$alt" | sort -n | head -1 )
            done
        done
        echo ${d[str1len+str1len*(str2len)]}
    fi
}

我知道您可以执行此操作,但是我被两个需要传递的参数以及我传递序列的事实所困扰。

我曾尝试使用此建议的各种版本,这些建议提倡这样的输入:

function levenshtein {
    # Grab input.
    declare input1=${1:-$(

这是我无法完全工作的部分。



1> chepner..:

您根本不需要awk

while IFS=$'\t' read num first second; do
    [[ $num -gt 0 ]] || continue
    levenshtein "$first" "$second"
done 

(的确,awk处理大文件的速度比快bash,但是如果首先要实现Levenshtein算法bash,则速度可能不是问题。)


顺便说一句,通过使用带有“元组”作为键的关联数组,不需要太多索引算术的更简单(尽管经过最少测试)的实现。

levenshtein () {
  if (( ${#1} <${#2} )); then
    levenshtein "$2" "$1"
    return
  fi

  local str1len str2len cost m a b i j
  local -A d

  str1len=${#1}
  str2len=${#2}
  for ((i=0;i<=strlen1;i++)); do
    d[$i,0]=0
  done

  for ((j=0;j<=strlen2;j++)); do
    d[0,$j]=0
  done

  for ((j=1; j<=str2len; j++)); do
    for ((i=1; i<=str1len; i++)); do
      a=${1:i-1:1}
      b=${2:j-1:1}
      [ "$a" = "$b" ] && cost=0 || cost=1
      del=$(( $d[$((i-1)),$j] + 1 ))
      ins=$(( $d[$i,$((j-1))] + 1 ))
      alt=$(( $d[$((i-1)),$((j-1))] + cost ))

      # Compute the min without forking
      m=$del; ((ins 


推荐阅读
author-avatar
井然洞中别样天
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有