使用Awk根据指定列值新增列并添加列名的语法问题
用Awk根据第4列内容新增列并添加列名(解决重复输出问题)
需求说明
给CSV文件末尾新增一列,规则如下:
- 首行追加列名
test - 数据行根据第4列内容生成新增列:
- 若第4列首字符为
P,取该列从第5位开始的4个字符 - 否则取该列前4个字符
- 若第4列首字符为
原文件内容(file1)
$ cat file1 f1,f2,f3,f4,f5 row1_1,row1_2,row1_3,SBCDE,row1_5 row2_1,row2_2,row2_3,AWERF,row2_5 row3_1,row3_2,row3_3,ASDFG,row3_5 row4_1,row4_2,row4_3,PRE-ASDQG,row4_5
问题解决
最初编写的Awk命令出现重复输出问题,调试后得到以下正确命令:
正确Awk命令
awk -F, -v OFS=, 'NR==1{ print $0, "test"} NR>1 { if (substr($4,1,1)=="P") print $0 (NR>1 ? FS substr($4,5,4) : "") else print $0 (NR>1 ? FS substr($4,1,4) : "") } ' file1
命令关键说明
-F, -v OFS=,:统一设置输入、输出的字段分隔符为逗号,保证CSV格式一致NR==1{ print $0, "test"}:单独处理首行,直接在末尾追加列名NR>1块处理数据行:- 通过
substr($4,1,1)判断第4列首字符 - 按规则截取目标字符,用字段分隔符连接到原行末尾输出
- 通过
最终输出结果
f1,f2,f3,f4,f5,test row1_1,row1_2,row1_3,SBCDE,row1_5,SBCD row2_1,row2_2,row2_3,AWERF,row2_5,AWER row3_1,row3_2,row3_3,ASDFG,row3_5,ASDF row4_1,row4_2,row4_3,PRE-ASDQG,row4_5,ASDQ
内容的提问来源于stack exchange,提问作者HattrickNZ
相关产品推荐
相关产品推荐

