【问题标题】:How to reverse a string in ksh如何在ksh中反转字符串
【发布时间】:2016-08-13 04:59:17
【问题描述】:

请帮我解决这个问题,我有一个数组女巫,其中包含 1000 行带有数字的行,它们被视为字符串,我希望所有这些行都将它们一一反转,我的问题是如何反转它们,因为我必须使用 ksh 或与 bash 或其他东西一起使用它会很容易.....我现在拥有的是这个,但是 rev="$rev${copy:$y:1}" 在 ksh 中不起作用。

i=0
while [[ $i -lt 999 ]]
do  
    rev=""
    var=${xnumbers[$i]}
    copy=${var}
    len=${#copy}
    y=$(expr $len - 1)
    while [[ $y -ge 0 ]]
    do  
        rev="$rev${copy:$y:1}"
        echo "y = " $y
        y=$(expr $y - 1)
    done

    echo "i = " $i
    echo "rev = " $rev
    #xnumbers[$i]=$(expr $xnumbers[$i] "|" $rev)
    echo "xum = " ${xnumbers[$i]}
    echo "##############################################"
    i=$(expr $i + 1)
done

【问题讨论】:

  • 你能举一个输入文件的例子并设置所需的输出吗?
  • 没有文件,它的 xnumbers 数组包含 1000 个整数,但在这里它们被视为字符串。例如,如果 i =50 xnumbers[ i ]=784 我希望 rev 给我回 rev= 487

标签: unix awk sed solaris ksh


【解决方案1】:

如果您可以将数组的内容打印到文件中,则可以使用此 awk oneliner 处理该文件。

awk '{s1=split($0,A,""); line=""; for (i=s1;i>0;i--) line=line A[i];print line}' file

检查一下!!

other_var=`echo ${xnumbers[$i]} | awk '{s1=split($0,A,""); line=""; for (i=s1;i>0;i--) line=line A[i];print line}'`

我已经在 Ubuntu 上使用 ksh 进行了测试,结果相同:

number="789"
other_var=`echo $number | awk '{s1=split($0,A,""); line=""; for (i=s1;i>0;i--) line=line A[i];print line}'`
echo $other_var
987

【讨论】:

  • 我不允许将它们保存在文件中,一切都必须通过脚本完成,并且没有任何东西可以保存。没有办法将我想要的字符串“提供”给这个 awk 脚本吗?
  • @hedgehog 也许你可以这样做; other_var=`回声变量 | awk '{s1=split($0,A,"");行=""; for (i=s1;i>0;i--) line=line A[i];print line}'`
  • 我认为您现在向我展示的内容有问题,您可以检查并报告吗?
  • 您可以回显一个变量并通过管道将其传递给 awk,将输出分配给另一个变量。
  • 我试过了,但它不能正常工作,没有报错,但它打印出来的结果和我输入的一样......它没有反转它。
【解决方案2】:

我不确定为什么我们不能使用内置的 rev 函数。

$ echo 798|rev
897

你也可以试试:

$ echo 798 | awk '{ for(i=length;i!=0;i--)x=x substr($0,i,1);}END{print x}'
897

【讨论】:

  • rev 可以在我检查过的 bash 中运行,在 ksh 中它不存在 :(
  • $ ksh $ echo 798 798 $ echo 798|rev 897 它对我有用
  • 当我尝试运行 rev 时,我收到错误 rev: not found
  • @hedgehog 当你运行bashtype rev会说什么?
  • 如果我在 bash 中使用 rev 它可以完美运行,关键是我不能为此使用 bash :(
【解决方案3】:

您可以同时使用cutpasterev,只需将printf 更改为cat file.txt:

paste -d' ' <(printf "%s data\n" {1..100} | cut -d' ' -f1) <(printf "%s data\n" {1..100} | cut -d' ' -f2 |rev)

或者 rev 单独,如果它不是 OP 澄清的编号文件。

【讨论】:

  • 如果你会使用 rev 你不需要其他任何东西......而且已经说过 rev 不适用于我的系统。
  • 你什么意思,我说它是编号的,我只是说我想传递一个带有数字的字符串并将其反转......仅此而已
猜你喜欢
  • 1970-01-01
  • 2014-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-28
  • 2021-12-04
相关资源
最近更新 更多