如何优化Shell命令提取TABLE行第二字段并拼接固定字符串
问题场景
现有存储表结构信息文件,每行记录分为两类格式:
TABLE SCHEMA.MYTAB, etc. etc....TABLE SCHEMA.MYTAB , etc. etc....
需要实现以下处理逻辑:
- 筛选出包含
TABLE关键字的行 - 提取以空格/逗号为分隔符的第二个字段,也就是
SCHEMA.MYTAB格式的表名 - 在提取到的表名前后分别拼接固定字符串
MARK和REJECT,最终输出格式为MARK SCHEMA.MYTAB REJECT
原有可运行命令串联了多段grep、awk、sed管道,写法冗余,需要简化为更简洁优雅的实现。
最优实现方案
直接用单个awk命令即可覆盖全部处理逻辑,无需串联多个进程管道,执行效率更高、代码更易维护:
awk '/TABLE/ {sub(/,.*/, "", $2); print "MARK", $2, "REJECT"}' dirx/myfile.txt
逻辑说明
/TABLE/:匹配所有包含TABLE关键字的行,替代原有grep TABLE的筛选逻辑- awk默认以任意空白字符作为字段分隔符,无论表名后紧跟逗号、还是逗号前带空格,第二个字段
$2都会捕获到带可选尾部逗号的表名片段 sub(/,.*/, "", $2):将$2中从第一个逗号开始的所有内容清空,直接得到纯SCHEMA.MYTAB格式的表名,无需额外按逗号分割字段print "MARK", $2, "REJECT":awk打印时会自动在逗号分隔的参数间添加空格,直接输出符合格式要求的结果,替代原有两段sed的首尾字符串拼接操作
如果偏好数组分割的写法,也可以用以下等价实现,效果完全一致:
awk '/TABLE/ {split($2, tbl, /,/); print "MARK " tbl[1] " REJECT"}' dirx/myfile.txt
内容的提问来源于stack exchange,提问作者kg_au
相关产品推荐
相关产品推荐

