shell脚本,awk合并一列的问题。
文件 file2内容如下:
0 qwert
1 asdfghjk
2 asdjkl
2 zxcvbn
3 dfghjkll
4 22222
4 tyuiop
4 bnm
让第一列相等的合并成一行,不要第一列,也就是变为如下格式:
22222;tyuiop;bnm
qwert
asdfghjk
asdjkl;zxcvbn
dfghjkll
第一种解法
解题思路:
awk '{if(a[$1]){a[$1]=a[$1]";"$2}else{a[$1]=$2}}END{for(i in a)print a[i]}' file2
file2
0 qwert
1 asdfghjk
2 asdjkl
2 zxcvbn
3 dfghjkll
4 22222
4 tyuiop
4 bnm
第一行 if(a[0]) 因为a[0]没有任何值,因此直接进行输出else a[0]= qwert
第二行 if(a[1]) 因为a[1]没有任何值,因此直接进行输出else a[1]= asdfghjk
第三行 if(a[2]) 因为a[2]没有任何值,因此直接进行输出else a[2]= asdjkl
第四行 if(a[2]) 因为a[2]= asdjkl,符合条件,执行a[$1]=a[$1]";"$2----> a[2]=a[2]";"$2--->a[2]=asdjkl;zxcvbn
第五行 if(a[3]) 因为a[3]没有任何值,因此直接进行输出else a[3]= dfghjkll
第六行 if(a[4]) 因为a[4]没有任何值,因此直接进行输出else a[4]= 22222
第七行 if(a[4]) 因为a[4]= 22222,符合条件,执行a[$1]=a[$1]";"$2----> a[4]=a[4]";"$2--->a[4]=22222;tyuiop
第八行 if(a[4]) 因为a[4]= 22222;tyuiop,符合条件,执行a[$1]=a[$1]";"$2----> a[4]=a[4]";"$2--->a[4]=22222;tyuiop;bnm
整个文件循环完毕后最后的结果是:
a[0]= qwert
a[1]= asdfghjk
a[2]=asdjkl;zxcvbn
a[3]= dfghjkll
a[4]=22222;tyuiop;bnm
END{for(i in a)print a[i]}
使用for去数组a的下标 0 1 2 3 4
然后分别打印 a[0] a[1] a[2] a[3] a[4]
(因为提取数组下标是一个不规则的输出,因此这个结果可能是随机排序)
第二种解法
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异