输入:
1234-A1;1235-A2;2345-B1;5678-C2;2346-D5
预期产出:
1234
1235
2345
5678
2346
显示的输入是用户输入。我想将它存储在一个数组中并执行一些操作来显示,如'预期输出'
所示我在perl中完成了它,但是想在shell脚本中实现它。请帮助实现这一目标。
答案 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