![如何根据子串映射数据?](https://linux22.com/image/205763/%E5%A6%82%E4%BD%95%E6%A0%B9%E6%8D%AE%E5%AD%90%E4%B8%B2%E6%98%A0%E5%B0%84%E6%95%B0%E6%8D%AE%EF%BC%9F.png)
我通过以下方式获得数据:
staging_uw_pc_account_contact_role_hive_tb
staging_uw_pc_account_hive_tb
staging_uw_pc_account_location_hive_tb
uw_pc_account_contact_hive_tb
uw_pc_account_contact_hive_tb_backup
uw_pc_account_contact_role_hive_tb
uw_pc_account_contact_role_hive_tb_backup
如何根据以下规则创建地图?
_backup
从末尾删除staging_
从头开始删除- 现在检查映射。
结果应该是这样的。并非每个表都应该有暂存和备份,在这种情况下这些字段应该为空。
uw_pc_account_contact_role_hive_tb, uw_pc_account_contact_role_hive_tb_backup, staging_uw_pc_account_contact_role_hive_tb
答案1
以下脚本将检测每行输入上awk
是否存在staging_
前缀和/或后缀。_backup
如果存在前缀和后缀,则将其删除,并将剩余的字符串用作名为 的关联数组中的键map
。
原始行保存在map
数组中,以逗号分隔的字符串形式与生成的键关联。
最后,map
打印出所有的整体。
BEGIN {
OFS = ", "
prefix = "staging_"
suffix = "_backup"
}
{
key = $0
sub("^" prefix, "", key)
sub(suffix "$", "", key)
map[key] = (map[key] == "" ? $0 : map[key] OFS $0)
}
END {
for (key in map) print map[key]
}
使用文件中的问题数据进行测试运行file
:
$ awk -f script file
staging_uw_pc_account_location_hive_tb
staging_uw_pc_account_hive_tb
uw_pc_account_contact_hive_tb, uw_pc_account_contact_hive_tb_backup
staging_uw_pc_account_contact_role_hive_tb, uw_pc_account_contact_role_hive_tb, uw_pc_account_contact_role_hive_tb_backup
输出的各个行中字段的顺序由原始文件中行的顺序确定。