Find all words containing characters in UNIX

后端 未结 6 936
误落风尘
误落风尘 2021-02-14 15:18

Given a word W, I want to find all words containing the letters in W from /usr/dict/words. For example, \"bat\" should return \"bat\" and \"tab\" (but not \"table\").

He

6条回答
  •  独厮守ぢ
    2021-02-14 15:34

    here's an awk implementation. It finds the words with those letters in "W".

    dict="/usr/share/dict/words"
    word=$1
    awk -vw="$word" 'BEGIN{
      m=split(w,c,"")
      for(p=1;p<=m;p++){ chars[c[p]]++ }
    }
    length($0)==length(w){
      f=0;g=0
      n=split($0,t,"")
      for(o=1;o<=n;o++){
        if (!( t[o] in chars) ){
           f=1; break
        }else{ st[t[o]]++ }
      }
      if (!f || $0==w){
          for(z in st){
            if ( st[z] != chars[z] ) { g=1 ;break}
          }
          if(!g){ print "found: "$0 }
      }
      delete st
    }' $dict
    

    output

    $ wc -l < /usr/share/dict/words
    479829
    
    $ time ./shell.sh look
    found: kolo
    found: look
    
    real    0m1.361s
    user    0m1.074s
    sys     0m0.015s
    

    Update: change of algorithm, using sorting

    dict="/usr/share/dict/words"
    awk 'BEGIN{
      w="table"
      m=split(w,c,"")
      b=asort(c,chars)
    }
    length($0)==length(w){
      f=0
      n=split($0,t,"")
      e=asort(t,d)
      for(i=1;i<=e;i++) {
        if(d[i]!=chars[i]){
            f=1;break
        }
      }
      if(!f) print $0
    }' $dict
    

    output

    $ time ./shell.sh #looking for table
    ablet
    batel
    belat
    blate
    bleat
    tabel
    table
    
    real    0m1.416s
    user    0m1.343s
    sys     0m0.014s
    
    $ time ./shell.sh #looking for chairs
    chairs
    ischar
    rachis
    
    real    0m1.697s
    user    0m1.660s
    sys     0m0.014s
    
    $ time perl perl.pl #using beamrider's Perl script
    table
    tabel
    ablet
    batel
    blate
    bleat
    belat
    
    real    0m2.680s
    user    0m1.633s
    sys     0m0.881s
    
    $ time perl perl.pl # looking for chairs
    chairs
    ischar
    rachis
    
    real    0m14.044s
    user    0m8.328s
    sys     0m5.236s
    

提交回复
热议问题