awkを使用したサブセットデータ

awkを使用したサブセットデータ

awkを使用してデータのサブセットを作成したいと思います。 testというファイルがあるとしましょう。

IP MAC Bandwidth etc etc

192.1.1.1 ff:ff:ff:ff 5.421M
192.1.2.3 ff:ff:ff:f3 5.120M
192.1.2.5 ff:ff:ff:f1 5.100M

stuff I don't want to be selected

帯域幅の値だけを選択したいです。 (Mとエンディングを取り除くことができれば良いでしょう。おそらくsedを使うこともできます。方法はわかりませんが、それは主な問題ではありません。)

私が現在やっている最高のサブセットは次のとおりです。

awk '{print $3}' test

出力は次のとおりです。

Bandwidth

5.421M
5.120M
5.100M

dont

しかし、私は次のようになりたいです:

5.421
5.120
5.100

「M」がそこにいたら問題にならなかったのですが、それがアイデアでした。 awkに関する情報を収集し、いくつかの試みをしてみましたが、まだ解決策が見つかりませんでした。

答え1

正確な回答を得るには、質問についてもう少し具体的にする必要があります。しかし、awkステートメントの一般的な構文は次のとおりです。

PATTERN { ACTION }

ACTION は PATTERN と一致する行でのみ実行されます。したがって、PATTERNACTION ブロックを使用して行ごとにサブセットを使用し、列ごとにサブセットを使用できます。たとえば、あなたのコメントに基づいて、次のように使用できます。

> awk '/^[0-9]/ {print $3 }' INPUTFILE
5.421M
5.120M
5.100M

以下は、最初のPATTERN文字が0から9の間の整数であるすべての行に一致する正規表現です。削除するには、Mたとえば別のコマンドにパイプするか、cuonglmの答えにあるコマンドをtr使用できます。gsub

awk '/^[0-9]/ { gsub(/M/, "", $3); print $3 }' INPUT_FILE

答え2

印刷する前に、数字や点以外のすべてを削除できます。

$ awk '{gsub(/[^[:digit:].]/,"",$3);print $3}' file
5.421
5.120
5.100

答え3

テキストで何かをする予定がない場合は、使用する方がsed合理的に見えます。

sed -En 's/.* (\S+)M$/\1/p'

-E\(, \+,バックスラッシュなどを使用するメタ文字を避けましょう。

-n この順序でなければ出力を抑制します。p

s/変える

.*空白のある行の最初の部分(貪欲のための最後のスペース)

()「逆方向接続」 - 括弧内のパターンを次のように呼び出すことができます。\number

\S空白以外のすべての記号(スペースを除くすべての:blank:記号)

+1つ以上の古いシンボル

M$行末の「M」

/p交換する行を印刷してください。

「全体の行を角かっこ内のパターンに置き換えて、そのような代替項目がある行のみを印刷します」を意味します。

答え4

awk で match 機能を使用することもできます。

awk '{match($3, /[0-9]+.[0-9]+/,arr)}{ print arr[0]}' file

関連情報