N 读取下一行,把需要的特征字符串标记出来,再匹配下一行是否符合这个特征,如果符合的话,就D,删除 pattern space 的第一行,并跳转去命令行开始处继续执行 N,读取下一行,如果不匹配了,那么 P 打印 pattern space 的第一行,并 D 删除第一行,又继续跳转去命令行首,这样就把特征相同的行,打印了最后一行,前面相同的都删除了。直到最后一行,N 无法读取下一行时就会中止后面的命令,并默认打印出最后 pattern space 里的内容。
#顺序随机:
awk '{a[$3$4$5]=$0}END{for(i in a)print a[i]}' file
sed ':a;N;/.*\(\(..\)\{3\}\)\n.*\1/s/\n.*//;ta;P;D' file
[解析]
原理也是差不多的,N 读取下一样,匹配这样的特征的,就把下一行替换掉(删除下一行),替换成功后跳转到标签a,继续 N 读取下一行,当不匹配特征时,不会完成替换,ta 自然也不会生效,这时候执行后面的 P;D 打印第一行并删除第一行,然后跳转至命令开始处继续执行。直到末行 N 无法读取下一行,则自动中止后面的命令,并输出 pattern space 里的内容。