一個awk函數, 模仿rev

一個awk函數, 模仿rev

以前用 bash 寫了一個, 如下

# bash function , usage: reverse string , ex: reverse ABCDE , --------> EDCBA

  reverse() {
              local i char
              local output=""
              local word=$1  
              local wlength=${#word}
            
              for (( i=$(( wlength - 1 )) ; i>=0  ; i-- ))
                 do
                    char=${word:$i:1}
                    output="${output}${char}"
                 done
                 echo "$output"
                 return 0
            }
#--------End of function----------------------------------

今天放假,用awk**屏艘粋?   ;) , 歡迎改良,意見

#-------BEGIN of function----------------------------------------------
# function reverse, awk version , usage: reverse(STRING)  
function reverse(STRING,     out, x, inlength) {
         inlength=length(STRING)
         while ( inlength > 0 ) {
           x=substr(STRING, inlength, 1)
           out=out x
           inlength--         
         }
         return out
   }

#----------END of function---------------------------------------------------

試用的畫面

fang@bash ~
$ cat revword.awk
#! /bin/gawk -f

  function reverse(STRING,     out, x, inlength) {
         inlength=length(STRING)
         while ( inlength > 0 ) {
           x=substr(STRING, inlength, 1)
           out=out x
           inlength--         
         }
         return out
   }

   END{
       print reverse($1), reverse($2), reverse($3), reverse($4)
      }

   
            

fang@bash ~
$ echo This is my sentence. | ./revword.awk
sihT si ym .ecnetnes

fang@bash ~
$      
journalist
或者我寫點解釋

function reverse(STRING,     out, x, inlength) {
       #第一個 STRING 是外部給來的參數, public,  out, x inlength 是函數內的數
       #awk 沒有 local, my , private 之類指定,只可用幾個空格分開就成局部量                                          

         inlength=length(STRING) # 得到長度      
         while ( inlength > 0 ) {    # 設定looping條件,
           x=substr(STRING, inlength, 1) #以 substr 得到字符最後一個字母,數字..之類
           out=out x  # x的返回稙放入空變量, awk 是用空格把子符連接的, out=out 會包含上次的字元
           inlength--    #  每一次遞減 1   
         }
         return out #結束looping,把結果返回變量
   }

希望有點用, 我也不是高手,大家交流交流, 謝謝      
journalist
递归一个:
引用:
-(dearvoid@LinuxEden:Forum)-(~/void/awk)-
[$$=3887 $?=0] ; cat rev.awk
#!/bin/awk -f

function rev(str)
{
    if (length(str) <= 1) {
        return str
    } else {
        return rev(substr(str, 2)) substr(str, 1, 1)
    }
}

BEGIN {
    for (ii = 1; ii < ARGC; ii++) {
        printf "%s\n", rev(ARGV[ii]);
    }
}
-(dearvoid@LinuxEden:Forum)-(~/void/awk)-
[$$=3887 $?=0] ; ./rev.awk This is my sentence.
sihT
si
ym
.ecnetnes
-(dearvoid@LinuxEden:Forum)-(~/void/awk)-
[$$=3887 $?=0] ; bye
      
版主的相當不錯,比較字符長度才執行,其實寫多些函數比script 好,可重復使用  

      
journalist
我比较欣赏Perl的reverse
区分了按字符翻转还是按词翻转
复制内容到剪贴板
代码:
[root@andLinux ~]# perl -le ' $str = reverse "@ARGV"; print $str ' abc def
fed cba

[root@andLinux ~]# perl -le ' @str = reverse @ARGV; print "@str" ' abc def
def abc
      
我也找 awk 的 reverse 来着, 不过没有找到, 还是 perl 强大哈       
我喜歡awk 小巧精緻, 不用在變量打 $ % @        
journalist
贡献两个:)
复制内容到剪贴板
代码:
shell递归函数
rever (){ if(( ${#1} >0 ));then rever(${1:1});echo -n ${1:0:1};fi }
awk版本
awk 'BEGIN{FS="";ORS=""}{for(i=NF;i>0;i--){print i};printf "\n"}'
      
引來高手,哈哈,我的目的成功  

很好的利用 awk 的 FS ORS ,bash 的 echo -n , 高!!      
journalist