1

次の行があるとします。

ターミナル="123" Pwd="567"

awkを使って数字部分だけを選択したい

awk 'match($1, /[0-9]+/){print substr($1, RSTART, RLENGTH)};match($2, /[0-9]+/){print   
substr($2, RSTART, RLENGTH)}' file

これにより、目的の結果が得られます。

123 567。

ただし、2 つの match ステートメントを記述せずに両方の数値を選択するためのより良い方法が他にあるはずです。

ありがとう。

4

4 に答える 4

3

grep はあなたのために働きますか?

kent$  echo 'Terminal="123" Pwd="567"'|grep -o '[0-9]\+'
123
567

awk を使用したクイック アンド ダーティ:

awk -F'[^0-9]*' '{$1=$1}7'

テスト:

kent$  awk -F'[^0-9]*' '{$1=$1}7'<<< 'Terminal="123" Pwd="567"'
 123 567

また:

kent$  awk '{gsub(/[^0-9 ]/,"")}7'<<< 'Terminal="123" Pwd="567"'
123 567
于 2013-08-28T10:13:10.643 に答える
2

これは素敵な小さな解決策ですawk:

awk '{gsub("[^0-9]+"," "); print}'

連続するすべての数字以外の文字を 1 つのスペースに変換するだけなので、数字シーケンスの前に 1 つのスペースが残ります123

于 2013-08-28T10:23:34.727 に答える
1

同様の問題に遭遇しましたが、パターンがより複雑だったため、問題を解決できませんでしたgsub。再帰関数とそのラッパーを書きました。1 つの変数で複数の一致を検出し、それらをスペースで区切って出力します。

awk '
    function rec_wrap(str) 
    {
        matches="" 
        return rec_func(str)
    }
    function rec_func(str2)
    {
        where=match(str2, /RE/)
        if(where!=0) {
            matches=(matches substr(str2, RSTART, RLENGTH) " ") 
            rec_func(substr(str2, RSTART+RLENGTH, length(str2)))
        }    
        return matches
    }
    {print rec_wrap($1)}
' file.txt

rec_wrap変数を空にするにはラッパーが必要ですmatches。関数matchは、左端の一致の位置と長さを変数RSTARTandに書き込み、RLENGTH一致を抽出しsubstrて variable に追加しますmatches。次に、一致が見つからなくなるまで、関数rec_funcは残りの文字列str2をパラメータとして自分自身を呼び出します。match

于 2015-05-11T21:08:00.350 に答える