

やり方がわかりません。

番号｜名前｜身長｜体重  
を記録したテーブルがあります。

ここから、身長170センチ以上180センチ以下の人を抽出したいのですが、

[code]

    grep $a ファイル名
    
[/code]

$aに170や180の身長を入れてwhileで回して検索していたのですが  
このやり方では体重とかぶって正確な値が出ない場合があります。  
（体重１７０キロの人が抽出されました）  
そこで列指定で、検索したいのですがやり方が思いつきません。

いい方法があればご教授ください。


CC BY-SA 3.0
2016-01-28T05:30:38.157
21423
2016-01-30T02:15:00.153
2016-01-28T13:45:27.257
8044
8044
question
linux shellscript
Linuxのシェルスクリプトで、文字列を検索するフィールドを指定する

[code]

    awk -F \| '$3 >= 170 && $3 <=  180 {print $0}' data.txt
    
[/code]

ですかね。

`-F \|`区切り文字の指定。`|`だとパイプとして認識されるので`\`でエスケープします。

各行に対して、  
`$3 >= 170 && $3 <= 180` `|`で区切った3番目のフィールドが170以上180以下の時に･･･  
`{print $0}` `$0`(行全体)を表示

と言う動作になります。


CC BY-SA 3.0
2016-01-28T05:55:32.090
21424
2016-01-28T05:55:32.090
5793
21423
answer


「シェルスクリプト」と言われてるので、あえて awk 使わず区切り文字の指定に `IFS` を使う例を。

[code]

    is_height_in_range() {
      local min=$1
      local max=$2
      local line="$3"
    
      IFS="|"
      set -- ${line}
      [ "$3" -ge "$min" ] && [ "$3" -le "$max" ]
      return
    }
    
    IFS=
    while read line; do
      is_height_in_range 170 180 "$line" || continue
      printf '%s\n' "$line"
    done
    
[/code]

`local` 使ってるので POSIX 互換ではないですが、たいていのシェルで動くと思います。

`read` が 0 以外のステータスを返すと `while`
ループから抜けてしまうので、ファイル末尾に改行がないと最終行が無視されますが、回答における本質ではないし実用上はあまり問題ないかと思うのでシンプルさを優先しました。


CC BY-SA 3.0
2016-01-30T02:15:00.153
21496
2016-01-30T02:15:00.153
2521
21423
answer