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