我有一串数字格式如下:
24_1_1_1_1_1_12_1_1_13_1_1
下划线为空格
我需要抓3个号码。在这种情况下的第一个数字24
,然后是后面两个1's
之后的数字,在这种情况下它是1
。然后另外两个1's
将是12
。我尝试了很多sed
,awk
和grep
解决方案来获得答案,但问题是任何所需的3个数字都可能是1,2或3位数。
所以在这个例子中我需要粗体数字。
24 _1_1_的 1 _1_1_的 12 _1_1_13_1_1
答案 0 :(得分:2)
您可以将$ IFS设置为_
并将字符串拆分为数组:
#!/bin/bash
string=24_1_1_1_1_1_12_1_1_13_1_1
OIFS=$IFS
IFS=_
ar=($string)
IFS=$OIFS
echo ${ar[0]} ${ar[3]} ${ar[6]}
答案 1 :(得分:1)
将字符串拆分为数组,然后迭代数组:
str="24_1_1_1_1_1_12_1_1_13_1_1"
IFS="_" read -ra numbers <<< "$str"
results=( ${numbers[0]} )
take_next=0
for n in "${numbers[@]:1}"; do
if (( take_next == 2 )); then
results+=( $n )
take_next=0
elif (( n == 1 )); then
(( take_next++ ))
else
take_next=0
fi
(( ${#results[@]} == 3 )) && break
done
答案 2 :(得分:0)
以下awk
单行如何打印第一个字段,然后打印两个字段后的每个字段:
$ awk 'NR==1||c==2{print;c=0;next}$1==1{c++}' RS=_ file
24
1
12
13
如果您想在一定数量的比赛后退出(例如3):
$ awk 'NR==1||c==2{print;c=0;m++;next}$1==1{c++}m==3{exit}' RS=_ file
24
1
12
答案 3 :(得分:0)
使用阅读:
read a x x b x x c x <<< "$str"
-
$ printf "%s\n" "$a" "$b" "$c"
24
1
12