如何将分隔文件中指定列逆透视为行?求优雅脚本方案
优雅解决CSV列转行问题(无需重复cut命令)
这绝对是awk的拿手好戏!不用重复写五次cut命令,一个简洁的awk脚本就能搞定所有转换,而且扩展性还强,完美适配你的需求。
核心解决方案:awk脚本
我们可以利用awk的循环功能,一次性遍历所有Nxx/Txx列对,自动生成目标行:
BEGIN { FS = OFS = "," } { # 循环处理1到5(对应N01-N05、T01-T05) for (i = 1; i <= 5; i++) { # 计算当前Nxx的列号:D是第4列,N01从第5列开始,所以是4+i n_col = 4 + i # 计算当前Txx的列号:N系列占5列,所以T01从第10列开始,即9+i(4+5+i) t_col = 9 + i # 输出A-D列 + Nxx值 + Txx值 + 计数器xx print $1, $2, $3, $4, $(n_col), $(t_col), i } }
使用方法
- 将上述脚本保存为
convert.awk文件 - 运行命令处理你的输入文件(假设输入文件名为
input.csv):
awk -f convert.awk input.csv > output.csv
或者直接用一行命令搞定,不用单独存脚本:
awk 'BEGIN{FS=OFS=","}{for(i=1;i<=5;i++)print $1,$2,$3,$4,$(4+i),$(9+i),i}' input.csv > output.csv
效果验证
拿你给出的第一行输入数据:
A01,B01,C01,0,1,2,3,4,5,101,102,103,104,105
脚本会自动生成5行目标输出:
A01,B01,C01,0,1,101,1 A01,B01,C01,0,2,102,2 A01,B01,C01,0,3,103,3 A01,B01,C01,0,4,104,4 A01,B01,C01,0,5,105,5
完全符合你想要的格式!
扩展性说明
如果以后N/T的数量变化(比如从N01-N5扩展到N01-N10),只需要修改两个地方:
- 把循环条件
i <= 5改成i <= 10 - 把T列的计算式
9 + i改成4 + 10 + i(也就是14 + i,因为N系列占10列,T从第4+10+1=15列开始)
整个脚本逻辑清晰,维护成本极低,比重复写cut命令优雅太多。
内容的提问来源于stack exchange,提问作者jg1991
相关产品推荐
相关产品推荐

