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重新累计 |
awk 'NR==FNR&&!($1 in array)&&$2!=0{array[$1]=$0}NR>FNR&&!($1 in array){array[$1]=$0}END{for(i in array){print array[i]}}' test92.txt test92.txt |