0

私は次のようにフォーマットされた数字の文字列を持っています:

24_1_1_1_1_1_12_1_1_13_1_1

アンダースコアはスペースです

私は3つの数字をつかむ必要があります。この場合は最初の番号24、次に次の2つ以降の番号1's(この場合は。) 1。その後、さらに2つ1'sになります12。私は答えを得るために多くの解決策を試しましsedたが、問題は、必要な3つの数字のいずれかが1、2、または3桁の長さになる可能性があることです。awkgrep

したがって、この例では、太字の数字が必要になります。

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次のワンライナーで最初のフィールドを印刷し、次に2つのフィールドの後にすべてのフィールドを印刷するのはどうですか。

$ 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 に答える