输入:具有排序行的文件
输出:如果我们要删除所有数字,则文件中包含与相邻行匹配的“唯一”行
例子
输入
abbylove2007
abbylove2008
abbylove2012
AbbyLove2014
abby1994lover
abby2007lover
abbylovesaal2018
abbylovesbsb2003
输出
abbylove2007
abby1994lover
这里留下了 abbylove2007 和 abby1994lover,因为有多个相邻行匹配 abbylove\d+ 和 abby\d+lover
答案1
$ awk '{ curr=$0; gsub("[0-9]","",curr) } curr != prev { prev=curr; prevfull=$0; flag=0; next } !flag { print prevfull; flag=1 }' test
abbylove2007
abby1994lover
首先,从当前行中删除数字。如果此结果与删除数字后的前一行不同,则用此行更新前一行,记住完整的前一行,并将变量设置flag
为零,然后继续下一行。
flag
当输出与前一行相同的行时使用该变量,以确保我们只输出第一的这些行。
对于与前一行相同的行(删除数字),如果未设置标志,则打印完整的前一行,然后设置标志。
答案2
这将是修改后的 sed 等价于uniq -d
:
sed '$!N; s/^\([^0-9]*\)\(.*\)\n\1[0-9].*$/\1\2/; t; D'