シェルスクリプトでファイルを1行ずつ読み、20%未満の行を削除する方法

シェルスクリプトでファイルを1行ずつ読み、20%未満の行を削除する方法

助けが必要です。このファイルがあり、forループを使用して1行ずつ読み込み、リスト%CPUの20%未満の行を削除したいと思います。

%CPU   PID USER       UID COMMAND         %MEM
71  9136 ashti     1000 firefox          4.6
36  1432 ashti     1000 gnome-shell      8.6
25 9100 ashti     1000 gedit            1.1
 3  9092 ashti     1000 nautilus         1.2
 2  9109 ashti     1000 gnome-terminal-  0.9
 1 1248 ashti     1000 Xorg             2.6
 0  1375 ashti     1000 VBoxClient       0.0
 0  9118 ashti     1000 bash             0.1
 0   269 root         0 systemd-journal  2.8

私はこの例のようなものが欲しい

%CPU   PID USER       UID COMMAND         %MEM
71  9136 ashti     1000 firefox          4.6
36  1432 ashti     1000 gnome-shell      8.6
25 9100 ashti     1000 gedit            1.1

そして新しいファイルに保存してください。

ありがとう

答え1

そしてgrep

grep -e "^%" -e "^[2-9][1-9]" file | column -t

column -tきれいにしてみてください:

%CPU  PID   USER   UID   COMMAND      %MEM
71    9136  ashti  1000  firefox      4.6
36    1432  ashti  1000  gnome-shell  8.6
25    9100  ashti  1000  gedit        1.1

答え2

予約済みヘッダーを使用すると、次のようにawk表されます。

$ awk 'NR==1 || (NR > 1 && $1 > 20)' file
%CPU   PID USER       UID COMMAND         %MEM
71  9136 ashti     1000 firefox          4.6
36  1432 ashti     1000 gnome-shell      8.6
25 9100 ashti     1000 gedit            1.1

答え3

この操作の場合、ループforは良い選択ではありません。理由の説明については、例を参照してください。

私の個人的な選択はMillerです。

$ mlr --pprint filter -x '${%CPU} < 20' file > newfile

$ cat newfile
%CPU PID  USER  UID  COMMAND     %MEM
71   9136 ashti 1000 firefox     4.6
36   1432 ashti 1000 gnome-shell 8.6
25   9100 ashti 1000 gedit       1.1

関連情報