grepコマンドを使用した数値抽出

grepコマンドを使用した数値抽出

次のファイル例があります。

some text is here  
   sometext(1,21);
   sometext(2,9);
   sometext(3,231);
   sometext(10,1112);
   sometext(11,17)
Some text is here

括弧内に2番目の数字を含む行を抽出しようとしているので、上記のsometext例では数字は21、、、、、です。9231111217

grep上記のパターンに合ったコマンドが見つかりませんでした。

答え1

GNUを使用している場合は、grepREを使用してコンマの後の数字を一致させることができます。

grep -oP ',\K\d+' file

ネイティブにperl該当する内容は次のとおりです。

perl -lne 'print for /,\K\d+/g' file

答え2

このgrepユーティリティは、少なくとも標準のUnixツールを使用したい場合は、行の一部を抽出するのには適していません。標準grepユーティリティはパターンに一致するライン全体をフィルタリングしますが、部分ラインを抽出する自然な方法はありません。より詳細な方法で線を操作するには、たとえばを使用できますsed

テキストが表示されているものより長くて多様であると仮定すると、テキスト文字列を介してsometext(2番目の整数値で行を処理するタイミングを伝えることができます。データ内の対応する文字列をチェックすると、2番目の整数の前後の横のビットを切り取ることができます。

ここでは、2つのトリム置換を適用します。 1つは行の先頭から行の最後のカンマまで、もう1つは閉じ括弧から行の終わりまで適用します。各行のデフォルト印刷をオフにし、-n2 番目の置換後に結果文字列を明示的に印刷します。

sed -n '/sometext(/ { s/.*,//; s/).*//p; }' file

また、特殊トリガー文字列と一致しない行を削除し、残りの行に両方の代替項目を適用するオプションもあります。

sed -e '/sometext(/!d' -e 's/.*,//' -e 's/).*//' file

結果のリストをカンマ区切りのリスト(質問に示されているように)にしたい場合は、上記のコマンドの結果をパイプすることを検討してください。

paste -d, -s -

あなたの質問に関するデータに基づいて、私たちは次のようになります。

$ sed -e '/sometext(/!d' -e 's/.*,//' -e 's/).*//' file | paste -d, -s -
21,9,231,1112,17

答え3

これには、フィールド区切り文字としてカンマまたは閉じawk括弧()を使用します。これにより、-F'[,)]'フィールド2()$2に希望の数字が生成されます。これを$2に数字のみが含まれている小切手と組み合わせます。

$ awk -F'[,)]' '$2 ~ /^[[:digit:]]+$/ {print $2}' input.txt 
21
9
231
1112
17

これは、$ 2に負以外の整数のみが含まれていると仮定します。負の数および/または間違いが含まれる可能性がある場合は、代わりに次を使用してください。

awk -F'[,)]' '$2 ~ /^[-+]?[[:digit:]]+(\.[[:digit:]]+)?$/ {print $2}' input.txt

注:awkはカンマをフィールド区切り文字として使用するため、カンマを小数点区切り文字として使用するロケールでは機能しません。

答え4

重い操作を実行するために使用することができ、カンマを望まないと仮定してクリーンアップにgrep使用できます。trまた、投稿から出力をどのようにレンダリングするかは不明であり、改行で区切られた数値のリストが生成されます。

grep -Eo ",[[:digit:]]+" input.txt | tr -d ","

または唯一の解決策trとして使用しないでください。grep

grep -Eo ",[[:digit:]]+" input.txt | grep -Eo "[^,]+"

関連情報