- 论坛徽章:
- 0
|
本帖最后由 useinxinuanihc 于 2010-05-21 16:49 编辑
urfile 文件如下
PBCSPOFT0101 0
PBCSPOFT0101 96
PBCSPOFT0102 0
PBCSPOFT0102 6
PBCSPOFT0103 0
PBCSPOFT0103 8
PBCSPOFT0104 0
PBCSPOFT0105 0
PBCSPOFT0106 0
PBCSPOFT0107 0
PBCSPOFT0107 10
PBCSPOFT0108 0
我想删除第一个字段重复的且第二个字段为0的行,结果应该如下
PBCSPOFT0101 96
PBCSPOFT0102 6
PBCSPOFT0103 8
PBCSPOFT0104 0
PBCSPOFT0105 0
PBCSPOFT0106 0
PBCSPOFT0107 10
PBCSPOFT0108 0
学习后,对黑哥的解决思路的分析,分享给大家,感谢朋友们的回答!!!
awk 'NR==FNR{a[$1]++;next}$2!=0||a[$1]==1' urfile urfile
|--^--| |--^--| |-^| |-^-| |-^-----| |--^-| ---^--
| | | | | | | |_第2次读数据文件
| | | | | | |_第1次读数据文件
| | | | | |_以第一个字段为下标的数组的值为1,
| | | | | 即本行的第一个字段的值在数据文件中
| | | | | 是唯一的,这时也执行打印数据的默认
| | | | | 操作
| | | | |_第2个字段的值不是0时执行打印数据的默认操作
| | | |-----^--------|
| | | |_此时NR!=FNR,即第2次读数据文件时,本判断
| | | 才开始起起作用
| | |_到下一行,本行记录后面的匹配都被忽略掉,这个很重
| | 要,因为没有的话后面的匹配会被执行。
| |_以第一个字段为下标的数组记录每一个第一个字段值相同的行
| 数,例如第一个字段值为 PBCSPOFT0107 的记录行数为2,那么
| a[PBCSPOFT0107]的值就为2,第一个字段值为 PBCSPOFT0106
| 的记录行数为1,那么a[PBCSPOFT0106]的值就为1.
|_NR:awk开始执行程序后所读取的数据行数
FNR:与NR功用类似,不同的是awk每打开一个新文件,FNR便从0重新累计 |
|