AWK のページ
UNIX OSX Linux は shellcommand にて使える。
PoweShell(x86) -> NG 別の方法があるがわざわざwindows
だけのコマンド覚えられるほど頭は柔らかくない。
WSL => Ubuntu or Cig-win or Mingwをインストールして、コマンドから
>bash を起動すればemacs も ls -laSr なんてオプションも使えるから
sshも・・・・
ここは awkのwebであった。
重要
1行コマンドとscriptでの方法がある。
データの区切りFS[file separat]が何かによって記述が変わる。
用法
awk '{command $Number,.,.,.}'
列番号は、1から数える。
sample.data の1列目は、パーミッション
5列目がファイル容量
9列目がファイル名
command部に
'{print $9,$5}'
と指定すれば全データより9列目のファイル名 ファイル容量のデータが作れる。
これを output.dataというファイル名で保存するなら、下記のように書けば良い。
[1]-------------------- command ルール
> sample.data > awk '{print $9,$5}' > output.data --> NG
なぜNGなのかわかるかな?
shellは、sample.data というコマンドを探すけど見つからんよという
エラーを出すんだ。
だからawkの部分を先頭に持ってきて
> awk '{print $9,$5}' < sample.data
と書く、これを他のファイルに書き込むので
> awk '{print $9,$5}' < sample.data > output.data
と書く。
なお、出力するファイルは
> output.data データを新規に書き込む
>> output.data データを追加書き込み
となる。
OUTPUT.data(途中略)
'#!GNU 900
'*GNU 897
. 0
'.#*GNU 17
.. 0
.bashrc 6054
.emacs.d 0
.inputrc 1919
.minttyrc 85
.profile 1236
.viminfo 1116
001awk 581
002awk 594
1 1141
[2]-------------------- Tabの挿入
なんか見づらいが、コンピュータが扱うデータはこれが最高なんだか
仕方ないから タブを入れてみよう
"\t"を$9と$5の間に入れる。
> awk '{print $9,"\t",$5}' < sample.data >output2.data
ouput2.data
'#!GNU 900
'*GNU 897
. 0
'.#*GNU 17
.. 0
.bashrc 6054
.emacs.d 0
.inputrc 1919
.minttyrc 85
.profile 1236
.viminfo 1116
001awk 581
002awk 594
1 1141
1.aux 234
1.dvi 1372
1.log 3256
少しは見やすくなったがファイル名の長さがまちまちなので
こうなる
[3]-------------------- printf
printの代わりにprintfを使うとそこそこフォーマットに合わせて出力させることが
可能だ。
%5d:10進数5桁
%10s:10文字分の文字列
%10.5s:10文字分のスペースに3文字分だけ書き出す
%7.2f:浮動小数点2桁で全7桁
> awk '{printf "%10.7s \t %5d\n",$9,$5}' < sample.data > output3.data
output3.data
'#!GNU 900
'*GNU 897
. 0
'.#*GNU 17
..   0
.bash_h   2130
.bash_p   1494
.bashrc   6054
.emacs.   0
.inputr   1919
.mintty   85
.profil   1236
.viminf   1116
001awk   581
002awk   594
1   1141
1.aux   234
1.dvi   1372
1.log   3256
[4]-------------------- 使える奴
> ls -laS *lisp* | awk '{printf "%2d \t %6d \t %10s \n", NR,$5,$9}'
script awk
awk -f 001.awk < sample.data > output6.data
== scriptfile ==
001.awk
BEGIN{
total=0
count=0
min=0
printf "Total File size check \n"
printf "File size / File name \n"
}{
total += $5
counter++
if ( $5 < 100 ) { min++ }
printf "%5d \t %10.7s \n",$5,$9
}
END{
printf "Total %4d files check and size is %10d Byte\n",counter,total
printf "100 byte under files are %3d files in this data \n",min
printf "[EOF]"
}
>cat output6.data
Total File size check
File size / File name
900 '#!GNU
897 '*GNU
0 .emacs.
1919 .inputr
85 .mintty
1236 .profil
1116 .viminf
581 001awk
594 002awk
1141 1
234 1.aux
1372 1.dvi
3256 1.log
16309 1.pdf
710 1.tex
693 1.tex~
0 1~
1 11
0 111
0 112
42 113
294 test
4291 tikz_ma
4241 tikz
Total 24 files check and size is 39912 Byte
100 byte under files are 7 files in this data
[EOF]%
sample.data
$ ls -la
合計 146
-rw-r--r-- 1 jw3kk 900 3月 17 12:23 '#!GNU Emacs!#'
-rw-r--r-- 1 w3kk w3kk 897 7月 22 2018 '*GNU Emacs*'
drwxr-xr-x+ 1 w3kk w3kk 0 7月 19 18:24 .
drwxrwxrwt+ 1 w3kk w3kk 0 7月 10 2018 ..
-rwxr-xr-x 1 w3kk w3kk 6054 7月 10 2018 .bashrc
drwx------+ 1 w3kk w3kk 0 7月 10 2018 .emacs.d
-rwxr-xr-x 1 w3kk w3kk 1919 7月 10 2018 .inputrc
-rw-r--r-- 1 w3kk w3kk 85 7月 11 2018 .minttyrc
-rwxr-xr-x 1 w3kk w3kk 1236 7月 10 2018 .profile
-rw------- 1 w3kk w3kk 1116 1月 27 11:46 .viminfo
-rw-r--r-- 1 w3kk w3kk 581 7月 19 18:24 001awk
-rw-r--r-- 1 w3kk w3kk 594 7月 19 18:24 002awk
-rw-r--r-- 1 w3kk w3kk 1141 7月 22 2018 1
-rwxr-xr-x 1 w3kk w3kk 234 7月 18 02:47 1.aux
-rwxr-xr-x 1 w3kk w3kk 1372 7月 18 02:47 1.dvi
-rwxr-xr-x 1 w3kk w3kk 3256 7月 18 02:47 1.log
成績の悪い奴は誰だかマークしろ
Calc
data
A 12 200
B 20 1200
C 45 360
D 56 290
E 45 127
F 8 15560
G 14 365
H 104 130
I 36 750
J 215 39850
K 101 12000
L 480 1300
M 266 1200
N 97 10600
O 101 3430
P 100 1000
Q 110 3600
R 20 10110
S 34 2001
T 768 1289
U 2400 2500
V 103 1000
W 203 700
x 365 500
Y 201 10600
Z 26 2600
上記成績から下記のような出力を作るscript
結果
% cat output7.data
Check/ Name / Total / Average
A 2400 16.67
B 24000 60.00
C 16200 8.00
D 16240 5.18
E 5715 2.82
xx F 124480 1945.00
G 5110 26.07
H 13520 1.25
I 27000 20.83
xx J 8567750 185.35
xx K 1212000 118.81
xx L 624000 2.71
xx M 319200 4.51
xx N 1028200 109.28
xx O 346430 33.96
P 100000 10.00
xx Q 396000 32.73
xx R 202200 505.50
S 68034 58.85
xx T 989952 1.68
xx U 6000000 1.04
xx V 103000 9.71
xx W 142100 3.45
xx x 182500 1.37
xx Y 2130600 52.74
Z 67600 100.00
26 Menbers Checking ... 15 Menbers is over cost
ALL Total is 22714231 and Average is 873624.27
> awk -f 002.awk < data > output7.data
========= script
BEGIN{
total=0
count=0
out=0
printf "Check/ Name / Total / Average \n"
}{
t=$2*$3
total += t
count++
if( t > 100000 ){
ck="xx"
out++
}
else {
ck=""
}
printf "%3s %2s %10d %10.2f \n",ck,$1,$2*$3,$3/$2
}
END{
printf "%2d Menbers Checking ... %2d Menbers is over cost \n",count,out
printf " ALL Total is %10d and Average is %10.2f \n " , total, total/count
}