私はこのファイルを持っています:
names average
john:15.02
Mark:09.63
James:12.58
10より大きい平均のみを抽出したいので、この例の出力は次のようになります。
15.02
12.58
私はこのファイルを持っています:
names average
john:15.02
Mark:09.63
James:12.58
10より大きい平均のみを抽出したいので、この例の出力は次のようになります。
15.02
12.58
回答:
awk
awk -F: '{if($2>10)print$2}' <filename
-F:
– F
ieldセパレーターを:
{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
[[ $0 > 10 ]]
字句比較として扱われることを忘れないでください
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は不可能です。
':[1-9][0-9]\+\.\?'
リテラル小数点\。オプションであり、最大で1回一致します\?。(@デザート、私のRegExの制限を指摘してくれてありがとう。)