gawk中将数组拼接为字符串时仅返回首个元素问题求助
gawk数组元素拼接为带空格字符串解决方案
问题根因
- 原拼接逻辑没有添加空格分隔符,即使正常执行也会输出无分隔的连续字符串
for (f in a)遍历gawk关联数组默认采用无序遍历,无法保证和输入顺序一致- 若在Windows cmd环境执行命令,gawk代码外层使用单引号会被cmd识别为无效的字符串边界,导致代码截断,仅返回第一个元素
- 原写法循环范围没有错误,print语句在循环外是正确写法,不需要调整
可用实现方案
方案1:按输入顺序拼接(无去重需求首选)
用行号NR作为数组下标保证顺序,拼接时自动处理开头多余空格:
*nix/macOS环境执行命令:printf "%s\n" ABC DEF GHI | gawk '{a[NR]=$0} END { for(i=1;i<=NR;i++) b = b (i==1 ? "" : " ") a[i]; print b }'
Windows cmd环境执行命令(调整引号适配cmd规则):@(echo ABC & echo DEF & echo GHI) | gawk "{a[NR]=$0} END { for(i=1;i<=NR;i++) b = b (i==1 ? \"\" : \" \") a[i]; print b }"
运行输出均为:ABC DEF GHI
方案2:保留去重逻辑
如果需要对输入内容去重(对应原写法的a[$0]++逻辑),可使用以下写法,自动处理空格分隔:
*nix/macOS环境执行命令:printf "%s\n" ABC DEF GHI | gawk '{a[$0]++} END { for(f in a) b = b (b?" ":"") f; print b }'
Windows cmd环境执行命令:@(echo ABC & echo DEF & echo GHI) | gawk "{a[$0]++} END { for( f in a ) b = b (b?\" \" : \"\") f; print b; }"
内容的提问来源于stack exchange,提问作者ZEE
相关产品推荐
相关产品推荐

