使用bash脚本从一组字符串中的下一个值

时间:2017-09-22 17:11:22

标签: bash shell awk sed grep

有人可以告诉我如何使用bash脚本获取此输出吗?

输入1:

xyzaa97
xyzaa98
xyzaa99

输出:

xyzaa100

输入2:

abc01
abc02

输出:

abc03

3 个答案:

答案 0 :(得分:4)

使用bash:

# get last line of file
name=$(tail -n 1 file)

# split $name in two parts with regex to array BASH_REMATCH
if [[ $name =~ ([a-z]+0*)([0-9]+) ]]; then

  # increase right part, option -i to set integer flag
  declare -i num=${BASH_REMATCH[2]}+1

  # join again both parts together
  echo "${BASH_REMATCH[1]}$num"
fi

使用此文件:

abc01
abc02

输出:

abc03

答案 1 :(得分:2)

好的,看到你的声明获得索引我完全误解了你的要求,所以这就是awk中的内容,请告诉我这是否对你有帮助。

awk 'END{val=$0;sub(/[a-zA-Z]+/,"",val);val++;sub(/[0-9]+/,val);print}'  Input_file

OR

awk 'END{val=$0;sub(/[a-zA-Z]+/,"",val);sub(/[0-9]+/,++val);print}'  Input_file

编辑:我之前尝试过匹配。

awk 'END{match($0,/.[^0-9]*/);print substr($0,RSTART,RLENGTH) substr($0,RLENGTH+1)+1}' Input_file

答案 2 :(得分:2)

gawk使用match()

awk 'END{match($0,/([A-Za-z])([0-9]+)$/,a); sub(a[2],sprintf("%02d",a[2]+1),$1); print $1}' infile

non-gawk使用split()

awk 'END{split($1,a,/[^0-9]+/); sub(a[2],sprintf("%02d",a[2]+1),$1); print $1}' infile

# OR

awk 'END{t=$1;sub(/[^0-9]+/,"",t);sub(/[0-9]+/,sprintf("%02d",t+1),$1); print $1}' infile

测试结果:

$ cat f
xyzaa97
xyzaa98
xyzaa99

$ awk 'END{split($1,a,/[^0-9]+/); sub(a[2],sprintf("%02d",a[2]+1),$1); print $1}' f
xyzaa100

$ cat f1
abc01
abc02

$ awk 'END{split($1,a,/[^0-9]+/); sub(a[2],sprintf("%02d",a[2]+1),$1); print $1}' f1
abc03