我有随机值,并希望所有w-*都只导出它们的最后一次出现。请记住,输出可能不同,短划线可以重复多次。
NAME
fair-3451-m
fair-3451-w-0
fair-3451-w-1
fair-4bb9-m
fair-4bb9-w-0
fair-4bb9-w-1
fair-4bb9-w-2
fair-4bb9-w-3
fair-sit-sed-1-4-m-0
fair-sit-sed-1-4-m-1
fair-sit-sed-1-4-m-2
fair-sit-sed-1-4-w-0
fair-sit-sed-1-4-w-1
fair-sit-sed-1-4-w-2
fair-sit-sed-1-4-w-3
prepr-uat-fair-m
prepr-uat-fair-w-0
prepr-uat-fair-w-1
prepr-uat-fair-w-2
prepr-uat-fair-w-3
prepr-sit-m
prepr-sit-w-0
prepr-sit-w-1
prepr-sit-w-2
prepr-sit-w-3
prepr-sit-w-4
prepr-sit-w-5
预期观点:
fair-3451-w-1
fair-4bb9-w-3
fair-sit-sed-1-4-w-3
prepr-uat-fair-w-3
prepr-sit-w-5
答案 0 :(得分:3)
EDIT2: 以OP的形式添加解决方案现在改变了Input_file示例。
解决方案1: 没有序列:
awk -F"-" '$0 ~ /-w-/{val=$0;$NF="";sub(/-$/,"");a[$0]=val} END{for(i in a){print a[i]}}' Input_file
解决方案第二: 使用序列。
awk -F"-" '$0 ~ /-w-/{val=$0;$NF="";sub(/-$/,"");a[$0]=val} !b[$0]++{c[++i]=$0}END{for(j=1;j<=i;j++){if(a[c[j]]){print a[c[j]]}}}' Input_file
EDIT4: 如果您想获得第一次出现,请执行以下操作。
awk -F"-" '$0 ~ /-w-/{val=$0;$NF="";sub(/-$/,"");if(!a[$0]++){b[$0]=val}} END{for(i in b){print b[i]}}' Input_file
关注awk
可能对您有帮助。
awk -F"-" '$2=="w"{a[$1]=$0} END{for(i in a){print a[i]}}' Input_file
编辑: 再添加一个解决方案,该解决方案将按照Input_file $1
的相同顺序提供输出。
awk -F"-" '!b[$1]++{c[++i]=$1} $2=="w"{a[$1]=$0} END{for(j=1;j<=i;j++){print a[c[j]]}}' Input_file
如果您有更多要求,上面的代码会检查$2
第二个字段应该是w
,然后我们也可以相应地更改它。