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
}

home