0

我有一串数字格式如下:

24_1_1_1_1_1_12_1_1_13_1_1

下划线是空格

我需要抓住 3 个数字。在这种情况下是第一个数字24,然后是以下两个之后的数字1's,在这种情况下它是一个1。然后再过两个1's就可以了12。我已经尝试了无数sed的解决方案来获得答案awkgrep但问题是所需的 3 个数字中的任何一个都可能是 1,2 或 3 位数字。

所以在这个例子中,我需要加粗的数字。

24 _1_1_ 1 _1_1_ 12 _1_1_13_1_1

4

4 回答 4

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]}
于 2013-03-09T19:44:55.523 回答
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
于 2013-03-09T19:50:51.153 回答
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
于 2013-03-09T20:03:18.160 回答
0

使用读取:

read a x x b x x c x <<< "$str"

-

$ printf "%s\n" "$a" "$b" "$c"
24
1
12
于 2013-03-09T22:31:22.683 回答