AWK 日常使用总结
上一篇 / 下一篇 2013-05-12 16:58:47 / 个人分类:AWK学习
TAG:
- 引用 删除 abinNO1 / 2020-08-07 11:35:26
-
内容:
a INTWMS4
b INTWMS4
a INTWMS3
b INTWMS4
分组求和:
awk '$2~/INTWMS4/{a[$1" "$2]++}END{for (i in a){print i,a[i]}}'
- 引用 删除 abinNO1 / 2019-11-20 15:19:26
-
1、split 的使用
echo 'abcd as,dsf,b' | awk -F' ' '{len=split($2,a,",");print "length="len}'
- 引用 删除 abinNO1 / 2019-11-10 03:40:00
-
1、比较 文件中的 第2 和第3列是否相同,相同则打印0 ,不同则打印1
awk '!NF{next} { if($2==$3) {print"0"} else print"1"}' file
- 引用 删除 abinNO1 / 2016-06-27 13:10:14
-
原帖由abinNO1于2013-05-21 11:02:54发表
1、定义数组时如果用“a[i]=$1;i++”的形式,其初始值i是为空的即为“null”,即a[ ]=$1;并非是a[0]=$1,.
awk 'NR==FNR{a[i]=$2;b[i]=$1;i++}NR>FNR{if(b[j]==$1){print $0,a[j]}else{print $0};j++}' aa bb
- 引用 删除 abinNO1 / 2013-05-30 16:09:50
-
3、可以将awk中的模式和动作单独写到一个文件中,如定义文件为awk.sh,内容如下:
BEGIN{
print "\tVMID\t\tVMMAC\n----------------- -----------------"}; #print heading.
NR==FNR{
a[$2]++;}
NR>FNR&&a[$1]==0{
i++;
printf "%17s %17s\n",$1,$2; #formate the datas
}
END{
print "\n" i " rows selected.\n"; #print ending.
}
执行如下命令即可调用改文件:
awk -f awk.sh a b_bak
- 引用 删除 abinNO1 / 2013-05-30 15:58:52
-
awk对于结构化的文本文件(行列数据)进行复杂的处理,相对于sed而言,还能进行复杂的编程,并且能够产生复杂的输出。
1、例如想输出只在文件b_bak存在而在a文件中没有的第一个字段,找到之后输出整个记录。
awk 'BEGIN{
print "\tVMID\t\tVMMAC\n----------------- -----------------"}; #print heading.
NR==FNR{
a[$2]++;}
NR>FNR&&a[$1]==0{
i++;
printf "%17s %17s\n",$1,$2; #formate the datas
}
END{
print "\n" i " rows selected.\n"; #print ending.
}' a b_bak
即可输出:
VMID VMMAC
----------------- -----------------
VM-20110811-00004 00:16:3e:48:40:88
1 rows selected.
2、想将b_bak中的所有数据按行全部打印出来:
awk '{for(i=1;i<=NF;i++){a[i]=$i; print a[i]}}' b_bak
- 引用 删除 abinNO1 / 2013-05-23 16:38:07
-
1、删除重复行:
awk '{if ($0!=line) print;line=$0}' ab
awk '!a[$0]++' ab
- 引用 删除 abinNO1 / 2013-05-23 16:31:19
-
1、将某个文件内容按列打印。
如:
cat a.txt
a
b
c
d
想得到"a b c d",可执行:
awk '{ORS=" ";print }' a.txt
2、将多个文件进行并:
cat b.txt
1
2
3
4
1)将a.txt 和b.txt进行合并得到:
a 1
b 2
c 3
d 4
可以执行:--通过顺序数组来完成
awk 'NR==FNR{a[i]=$0;i++}NR>FNR{print a[j]" "$0;j++}' a.txt b.txt
也可以执行: --以FNR下标来组成顺序数组完成
awk 'NR==FNR{a[FNR]=$0}NR>FNR{print a[FNR]" "$0;}' a.txt b.txt
也可以执行:--通过getline来实现
awk '{getline d <"a.txt";print d,$0}' b.txt
3、如果b.txt为: 如果想让a.txt和b.txt合并之后,如果b.txt有一个字段为空就用"NULL"来替换。
cat b.txt
1
2
3
执行如下语句:
awk 'NR==FNR{a[i]=$0;i++}NR>FNR{if(a[j]==""){print "NULL "$0}else{print a[j]" "$0};j++}' b.txt a.txt
既可以得到:
1 a
2 b
3 c
NULL d
- 引用 删除 abinNO1 / 2013-05-21 11:02:54
-
1、定义数组时如果用“a[i]=$1;i++”的形式,其初始值i是为空的即为“null”,即a[ ]=$1;并非是a[0]=$1,所以如果后面从0开始调用的时候会漏掉"a[ ]=$1",所以建议从1开始定义数组。
2、如果要求b_bak文件中的第一个字段与a文件中的第二个字段相同的时候,将b_bak中对应的第二个字段紧接到a文件对应行的后面。
下面这种方式就可以得到正确的结果:
awk 'NR==FNR{i++;a[i]=$1;b[i]=$2;c[i]=a[$1]++}NR>FNR{d[m]=e[$2]++;for(j=1;j<i+1;j++){if($2==a[j]&&c[j]==d[m]){print j,b[j],$0,c[j],m,d[m];break}};m++}' b_bak a
说明:数组c[i]保存的是文件第一个字段重复的次数即a[$1]++
3、上面的情况就不能使用关联数组来做。
使用关联数组的时候要注意:
1)当关联的字段有重复的时候,被关联的对象如果不一样,多个文件进行关联的时候,被关联的对象就会被覆盖:
如 aa文件:
aa ddga
aa dddd
dd gaga
bb文件:
aa haha
aa cccc
cc xixi
要求:得到如下的结果:
aa haha ddga
aa cccc dddd
cc xixi
如果用如下形式就会有问题:
awk 'NR==FNR{a[$1]=$2}NR>FNR&&b=$1{print $0,a[$1]}' aa bb
得到了:
aa haha dddd
aa cccc dddd
cc xixi
此时需要用数组去关联:
awk 'NR==FNR{i++;a[i]=$1;b[i]=$2;c[i]=a[$1]++}NR>FNR{d[m]=e[$1]++;for(j=1;j<i+1;j++){if(a[j]==$1&&c[j]==d[m]){print $0,b[j];break}else if(a[j]!=$1){print $0;break}};m++}' aa bb
原帖由abinNO1于2013-05-20 17:29:50发表
数组关联
1、cat b_bak a
VM-20111104-00001 00:16:3e:48:40:84
VM-20110520-00006 00:16:3e:48:40.
- 引用 删除 abinNO1 / 2013-05-20 17:29:50
-
数组关联
1、cat b_bak a
VM-20111104-00001 00:16:3e:48:40:84
VM-20110520-00006 00:16:3e:48:40:85
VM-20110520-00006 00:16:3e:48:40:86
VM-20110811-00003 00:16:3e:48:40:87
VM-20110811-00004 00:16:3e:48:40:88
VM-20110816-00007 00:16:3e:7d:b0:ba
VM-20110816-00007 00:16:3e:48:40:81
VM-20110816-00006 00:16:3e:48:40:82
VM-20111104-00001 00:16:3e:48:40:83
c3rn.vrs.0.vm.i-1a15d7089 VM-20110816-00007 10.71.192.117 192-168-1-109-20110815035415 "C_01" "blade9"
c3rn.vrs.0.vm.i-1a15d7089 VM-20110816-00007 10.1.0.59 192-168-1-109-20110815035415 "C_01" "blade9"
c3rn.vrs.0.vm.i-1a15d7087 VM-20110816-00006 10.1.0.58 192-168-1-109-20110815035415 "C_02" "blade10"
c3rn.vrs.0.vm.i-1a15d7014 VM-20111104-00001 10.71.184.77 192-168-2-17-20110121024432 "C_05" "blade13"
c3rn.vrs.0.vm.i-1a15d7014 VM-20111104-00001 10.1.0.82 192-168-2-17-20110121024432 "C_05" "blade13"
c3rn.vrs.0.vm.i-1a15d7017 VM-20110520-00006 10.71.184.150 192-168-2-17-20110121024432 "C_05" "blade13"
c3rn.vrs.0.vm.i-1a15d7017 VM-20110520-00006 10.0.0.108 192-168-2-17-20110121024432 "C_05" "blade13"
c3rn.vrs.0.vm.i-1a15d7010 VM-20110811-00003 10.71.184.101 192-168-1-18-20110328121943 "C_05" "blade10"
2、awk 'NR==FNR{a[i]=$1;b[i]=$2;c[i]=a[$1]++;i++}NR>FNR{d[m]=e[$2]++;while(j<i){if($2==a[j]&&c[j]==d[m]){print j,b[j],$2,c[j],m,d[m];break}j++}m++}' b_bak a
- 引用 删除 abinNO1 / 2013-05-15 10:07:31
-
1、cat aa bb
aa haha
bb dddd
cc
aa haha
bb cccc
cc
2、打印bb上有,aa上没有的第二个字段:
awk 'NR==FNR{a[$2]++}NR>FNR&&a[$2]!=1{print $2}' aa bb
- 引用 删除 abinNO1 / 2013-05-14 20:35:18
-
1、关联数组的另一种等效写法。
cat a b
c3rn.vrs.0.vm.i-1a15d7089 VM-20110816-00007 10.71.192.117 192-168-1-109-20110815035415 "C_01" "blade9"
c3rn.vrs.0.vm.i-1a15d7089 VM-20110816-00007 10.1.0.59 192-168-1-109-20110815035415 "C_01" "blade9"
VM-20110816-00007 00:16:3e:7d:b0:ba
VM-20110816-00007 00:16:3e:48:40:81
awk 'NR==FNR{a[i]=$1" "$3" "$4" "$5" "$6;i++}NR>FNR{print $0,a[j];j++}' a b
我的栏目
标题搜索
日历
|
|||||||||
日 | 一 | 二 | 三 | 四 | 五 | 六 | |||
1 | 2 | 3 | 4 | 5 | 6 | 7 | |||
8 | 9 | 10 | 11 | 12 | 13 | 14 | |||
15 | 16 | 17 | 18 | 19 | 20 | 21 | |||
22 | 23 | 24 | 25 | 26 | 27 | 28 | |||
29 | 30 |
我的存档
数据统计
- 访问量: 127750
- 日志数: 67
- 建立时间: 2010-12-07
- 更新时间: 2019-08-28