仅导出最后一次出现的字符串包含特定值

时间:2018-04-05 06:28:53

标签: bash awk sed

我有随机值,并希望所有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

1 个答案:

答案 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,然后我们也可以相应地更改它。