[sh]awk用法
grep匹配第一个则停止
grep -m
-m num, --max-count=num
Stop reading the file after num matches.
shell中的数组
- 定义
nums=(29 100 13 8 91 44)
# 弱类型的
arr=(20 56 "http://c.biancheng.net/shell/")
- 添加元素
awk将二维表转换为kv格式
awk '
{
if(NR == 1) {
for (i=2; i <= NF;i++) type[i]=$i
}else {
for (j=2;j <= NF; j++) arr[$1,type[j]]=$j
}
}
END {
for (k in arr) {
split(k, idx, SUBSEP);
gsub(/\.|-/,"_",idx[1])
gsub(/\/|\(|\)/,"_",idx[2])
gsub(/False/,"0",arr[k])
gsub(/True/,"1",arr[k])
print "GamesvrOnline""{usage=\""idx[2]"\",GameSvr=\""idx[1]"\"} "arr[k]
}
}'
nums[6]=88
ages=([3]=24 [5]=19 [10]=12) # 只支持整型下标
- 获取元素
n=${nums[2]}
# 获取所有元素
${nums[*]}
${nums[@]}
- 实例
nums=(29 100 13 8 91 44)
echo ${nums[@]} #输出所有数组元素
nums[10]=66 #给第10个元素赋值(此时会增加数组长度)
echo ${nums[*]} #输出所有数组元素
echo ${nums[4]} #输出第4个元素
29 100 13 8 91 44
29 100 13 8 91 44 66
91
awk的for循环
学习awk的内置变量,及默认值
学习awk的内置函数
awk中数组和shell中数组用法不一样. 它支持字符串下标
awk一维数组
a) 数字下标
array[1]="it"
array[2]="homer"
array[3]="sunboy"
array[4]=2050
b) 字符下标
array["first"]="yang"
array["second"]="gang"
array["third"]="sunboy"
- 获取
#!/bin/bash
awk 'BEGIN{
array[1]="it"
array[2]="homer"
array[3]="sunboy"
array[4]=2050
array["first"]="yang"
array["second"]="gang"
array["third"]="sunboy"
print array[1], array[4]
print array[3], array["third"]}'
- 遍历
#!/bin/bash
awk 'BEGIN{
for(i=1; i<=5; i++){
array[i] = i*2 - 1;
}
for(i in array){
print i" = " array[i];#i是下标, array[i]是对应的值
}
}'
awk二维数组
awk 多维数组在本质上是一维数组,因awk在存储上并不支持多维数组,
awk提供了逻辑上模拟二维数组的访问方式。例如,array[2,3] = 1这样的访问是允许的。
awk使用一个特殊的字符串SUBSEP (\034)作为分割字段,
在上面的例子 array[2,3] = 1 中,关联数组array存储的键值实际上是2\0343,
2和3分别为下标(2,3),\034为SUBSEP分隔符
类似一维数组的成员测试,多维数组可以使用 if ( (i,j) in array) 语法,但是下标必须放置在圆括号中。
类似一维数组的循环访问,多维数组使用 for ( item in array ) 语法遍历数组。与一维数组不同的是,多维数组必须使用split()函数来访问单独的下标分量,格式: split ( item, subscr, SUBSEP), 例如: split (item, array2, SUBSEP); 后,array2[1]为下标“2”, array2[2]为下标“3”
示例:
#!/bin/bash
awk 'BEGIN{
for(i=1; i<=3; i++){
for(j=1; j<=3; j++){
array[i, j] = i * j;
print i" * "j" = "array[i,j];
}
}
print
for(i in array){
split(i, array2, SUBSEP);
print array2[1]" * "array2[2]" = " array[i]; # array2[1]为下标第一项, array2[1]为下标第二项,
}
}'
- 内置函数
[gsub(//|(|)/,"_",idx[2]) # 返回替换的次数.(https://blog.csdn.net/zhuying_linux/article/details/7104938)
length