ファイルからしきい値より大きい値のみを抽出する方法は?


10

私はこのファイルを持っています:

names average
john:15.02
Mark:09.63
James:12.58

10より大きい平均のみを抽出したいので、この例の出力は次のようになります。

15.02
12.58

回答:


18

awk

awk -F: '{if($2>10)print$2}' <filename

解説

  • -F:Fieldセパレーターを:
  • {if($2>10)print$2}-かどうかを、各ラインのためのテスト2番目のフィールドである>10もしそうなら、printそれは
  • <filename–シェルにファイルを開かfilenameせてawkください。そうするよりもましです。トピックに関するStéphaneChazelasの回答を参照してください

実行例

$ <filename awk -F: '{if($2>10)print$2}'
15.02
12.58

スペースを追加してパターンを大括弧の外側に配置することもできます。これにより、これらは等しくなります。それを指摘してくれたStefanに感謝します。

awk -F: '{if($2>10)print$2}' <filename
awk -F: '{ if ( $2 > 10 ) print $2 }' <filename
awk -F: '$2>10{print$2}' <filename
awk -F: '$2 > 10 { print $2 }' <filename

このような状況でコマンド「カット」と「grep」(基本コマンド)のみを使用して、平均が10を
超える

私はあなたの解決策を理解しています、完璧です、助けてくれてありがとう、私はあなたの努力に感謝します..
Haikel Fazzani

bashが[[ $0 > 10 ]]字句比較として扱われることを忘れないでください
とにかく、

@dessert:私は個人的に、アクションステートメントの前にパターンを配置することを好みます。例:awk -F: '$ 2> 10 {print $ 2}'、見た目が良く、拡張が簡単(例:$ 2> 10 && $ 2 <100) 。
ステファン

3

grepでは、正規表現を使用する必要があります。例えば

grep -E ':[^0-9]*[1-9][0-9][0-9]*\.' file | cut -d':' -f2

sedと同様:

sed -n 's/.*:[^0-9]*\([1-9][0-9][0-9]*\..*\)/\1/p' file

しかし、順序付けされたデータでRegExを使用すると、エラーが発生しやすく(私の経験では)、読みにくくなります;-)。


非常に賢い!grep ':[1-9][0-9]\+\.' <file | cut -d: -f2およびに短縮できますsed -n 's/.*:\([1-9][0-9]\+\..*\)/\1/p' <file。これは> 1、> 10、> 100などでのみ機能することを言及する価値があります。たとえば、> 20は不可能です。
デザート'19

RegExでバグを見つけました。小数点のない数値の場合、RegExは次のようにする必要があります。- ':[1-9][0-9]\+\.\?'リテラル小数点\。オプションであり、最大で1回一致します\?。(@デザート、私のRegExの制限を指摘してくれてありがとう。)
Stefan
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.