6

私はこの形式で出力を持っています:

Infosome - infotwo: (29333) - data-info-ids: (33389, 94934)

最後の中かっこの最後の 2 つの数字を抽出したいと思います。最後の中かっこのペアに数字が 1 つしかない場合があります。

これは私が使用したコードです。

echo "Infosome - infotwo: (29333) - data-info-ids: (33389, 94934)" | \
  tr "," " " | tr "(" " " | tr ")" " " | awk -F: '{print $4}'

値を抽出するよりクリーンな方法はありますか? またはより最適な方法ですか?

4

3 に答える 3

14

これを試して:

awk -F '[()]' '{print $(NF-1)}' input | tr -d ,

これは、コマンドの一種のリファクタリングです。

于 2012-08-15T23:51:50.573 に答える
3
 awk -F\( '{gsub("[,)]", " ", $NF); print $NF}' input

あげる

 33389  94934 

この問題のコンテキストでの「最適」/「プロフェッショナル」の意味については少しわかりませんが、これは 1 つのコマンド/ツールのみを使用しており、それが適切かどうかはわかりません。

または@kevのアプローチに基づいて構築します(ただしtr、コンマを削除する必要はありません):

awk -F'[(,)]' '{print $4, $5}' input

出力:

33389  94934
于 2012-08-15T23:58:58.970 に答える
1

これは、純粋な bash でも実行できます。テキストが常に質問のサンプルのように見えると仮定すると、次のように動作するはずです。

$ text="Infosome - infotwo: (29333) - data-info-ids: (33389, 94934)"
$ result="${text/*(}"
$ echo ${result//[,)]}
33389 94934

これは、シェルの「パラメータ展開」(bash のマニュアル ページで検索できます) を使用して、tr. 厳密に言えば、2 行目の引用符は必要ありませんが、StackOverflow 構文の強調表示に役立ちます。:-)

または、関心のある実際のフィールドを探すことで、これをもう少し柔軟にすることもできます。GNU awk を使用している場合は、RS を複数の文字で指定できます。

$ gawk -vRS=" - " -vFS=": *" '
  { f[$1]=$2; }
  END {
    print f["data-info-ids"];
    # Or you could strip the non-numeric characters to get just numbers. 
    #print gensub(/[^0-9 ]/,"","g",f["data-info-ids"]);
  }' <<<"$text"

私はこの方法を好みます。なぜなら、入力データが実際に何であるか (ある種の配列を表す構造化テキスト) を解釈するからです。

于 2012-08-16T02:24:33.390 に答える