如何根据子串映射数据?

如何根据子串映射数据?

我通过以下方式获得数据:

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

如何根据以下规则创建地图?

  1. _backup从末尾删除
  2. staging_从头开始删除
  3. 现在检查映射。

结果应该是这样的。并非每个表都应该有暂存和备份,在这种情况下这些字段应该为空。

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

输出的各个行中字段的顺序由原始文件中行的顺序确定。

相关内容