在shell脚本中编辑一个字符串并将其显示为数组

时间:2017-03-27 11:47:28

标签: arrays string bash shell unix

输入:

1234-A1;1235-A2;2345-B1;5678-C2;2346-D5

预期产出:

1234
1235
2345
5678
2346

显示的输入是用户输入。我想将它存储在一个数组中并执行一些操作来显示,如'预期输出'

所示

我在perl中完成了它,但是想在shell脚本中实现它。请帮助实现这一目标。

4 个答案:

答案 0 :(得分:0)

要将输入文本拆分为数组,您可以遵循以下技巧:

IFS="[;-]" read -r -a arr <<< "1234-A1;1235-A2;2345-B1;5678-C2;2346-D5"
printf '%s\n' "${arr[@]}"
1234
A1
1235
A2  
2345
B1  
5678
C2  
2346
D5 

如果你想按照预期的输出只保留1234,1234等,你可以使用相应的数组元素(0-2-4-etc)或做类似的事情:

a="1234-A1;1235-A2;2345-B1;5678-C2;2346-D5"
IFS="[;]" read -r -a arr <<< "${a//-[A-Z][0-9]/}"   #or more generally <<< "${a//-??/}"
declare -p arr     #This asks bash to print the array for us
#Output
declare -a arr='([0]="1234" [1]="1235" [2]="2345" [3]="5678" [4]="2346")'
# Array can now be printed or used elsewhere in your script. Array counting starts from zero

答案 1 :(得分:0)

试试这个 -

awk -F'[-;]' '{for(i=1;i<=NF;i++) if(i%2!=0) {print $i}}' f
1234
1235
2345
5678
2346

echo "1234-A1;1235-A2;2345-B1;5678-C2;2346-D5"|tr ';' '\n'|cut -d'-' -f1

正如@George Vasiliou建议 -

awk -F'[-;]' '{for(i=1;i<=NF;i+=2) {print $i}}'f

如果数据需要存储在数组中并且您正在使用gawk,请尝试以下 -

awk -F'[;-]' -v k=1 '{for(i=1;i<=NF;i++) if($i !~ /[[:alpha:]]/) {a[k++]=$i}} END {
> PROCINFO["sorted_in"] = "@ind_str_asc"
> for(k in a) print k,a[k]}' f
1 1234
2 1235
3 2345
4 5678
5 2346
 PROCINFO["sorted_in"] = "@ind_str_asc" used to print the data in
 sorted order.

答案 2 :(得分:0)

@Yash:@try:

echo "1234-A1;1235-A2;2345-B1;5678-C2;2346-D5" | awk '{gsub(/-[[:alnum:]]+/,"");gsub(/;/,RS);print}'

将所有alpha bate替换为NULL,然后将所有半冒号替换为RS(记录分隔符),默认情况下为新行。

答案 3 :(得分:0)

感谢@George和@Vipin。

根据您的输入,最适合我的环境的解决方案如下:

i=0
a="1234-A1;1235-A2;2345-B1;5678-C2;2346-D5"
IFS="[;]" read -r -a arr <<< "${a//-??/}"
#declare -p arr
for var in "${arr[@]}"
do
    echo " var $((i++)) is : $var"  
done

输出:

 var 0 is : 1234
 var 1 is : 1235
 var 2 is : 2345
 var 3 is : 5678
 var 4 is : 2346