awkのいくつかの使用記録(更新ing)
2659 ワード
awk
A :
50
500
5000
50000
B :
:
50
[root@localhost ~]$ cat a b |sort -k1 |awk 'BEGIN{t=""}{t=$1;if(tt==t){printf("%s",$2);printf("
")}else{printf("%s %s ",$1,$2);}tt=t}'
50000
50
5000
500
考え方:2つのファイルをマージしてソートする
[root@localhost ~]$ cat a b |sort -k1
50000
50
5000
500
$1, , $1 , $2, 。 , else $1,$2 50000。 $2 。
50
どうすればいいの?
cat a b |sort -k1 |awk 'BEGIN{t=""}{t=$1;if(tt==t){printf("\t");printf("%s",$2);printf("
")}else{printf("%s %s",$1,$2);printf("
")}tt=t}'
50000
50
5000
500
。
cat blog.log
http://www.baidu.org/index.html
http://www.baidu.org/1.html
http://post.baidu.org/index.html
http://mp3.baidu.org/index.html
http://www.baidu.org/2.html
http://post.baidu.org/2.html
中間のドメイン名をもらうにはどう書きますか?
awk -F '[/]+' 'BEGIN{print "site""\t""count"}{array[$2]++}END{for(key in array) print key,"\t" array[key]}' blog.log
site count
www.baidu.org 3
post.baidu.org 2
mp3.baidu.org 1
'/'を区切り記号として、配列を定義します.
別の方法:
awk '{split($0,array,"/+");key=array[2];count[key]++}END{for(kk in count)print kk count[kk]}' blog.log
このような個数ではなく、平均数なら?次のようになります.
工号の名前の給料は平均の給料を求めます
cat average.txt
001 wudi 1000
002 jony 2000
003 wudi 2000
004 jony 3000
005 deng 2500
[root@MonitorANDBack ~]$ awk '{array[$2]+=$3;count[$2]++}END{for (key in array) print key,array[key],array[key]/count[key]}' average.txt
jony 5000 2500
deng 2500 2500
wudi 3000 1500
ここで名前、総数、平均数を見ることができます.ここでcount[]は関数です.
:
[root@MonitorANDBack ~]$ array=(good morning sir)
[root@MonitorANDBack ~]$ echo ${array[0]}
good
[root@MonitorANDBack ~]$ echo ${array[1]}
morning
[root@MonitorANDBack ~]$ echo ${array[2]}
sir
[root@MonitorANDBack ~]$ echo ${array[3]}
[root@MonitorANDBack ~]$ echo ${array[@]}
good morning sir
[root@MonitorANDBack ~]$ echo ${array[#]}
-bash: #: syntax error: operand expected (error token is "#")