AWK文本处理:如何修改新增列首行值并调整分隔符
调整AWK命令实现定制化列插入需求
我来帮你修改AWK命令,完美满足你提出的两个要求:
- 首行新增列的值替换为
CYCLE_NUMBER - 首行中新增列与
APPLICATION_STATUS列之间仅用单个制表符分隔,其余行保持原有的三个制表符分隔格式
修改后的AWK命令
awk -v insert_col=4 -v header_val="CYCLE_NUMBER" -v row_val="four" ' BEGIN { orig_sep = "\t\t\t" # 定义默认的三制表符分隔符 header_special_sep = "\t" # 首行需要的单制表符分隔符 } # 单独处理首行 NR == 1 { # 按原分隔符拆分整行到数组 split($0, fields, orig_sep) # 从插入位置开始,将数组元素后移一位,腾出插入位置 for (i = length(fields); i >= insert_col; i--) { fields[i+1] = fields[i] } # 插入首行的定制值 fields[insert_col] = header_val # 拼接数组生成首行内容,重点处理分隔符 output = fields[1] for (i = 2; i <= length(fields); i++) { # 当拼接新增列和原APPLICATION_STATUS列时,用单制表符 if (i == insert_col + 1) { output = output header_special_sep fields[i] } else { # 其他列之间保持三制表符 output = output orig_sep fields[i] } } print output next # 跳过后续通用处理 } # 处理非首行,保持原逻辑 { FS = OFS = orig_sep for (i = NF + 1; i > insert_col; i--) { $i = $(i-1) } $insert_col = row_val print $0 } ' file1.txt
命令逻辑解释
- BEGIN块:提前定义好两种分隔符,避免重复写死字符串,提升可读性。
- 首行处理:
- 用
split拆分原行,方便精准调整列的位置和分隔符。 - 数组元素后移腾出插入位置,插入
CYCLE_NUMBER。 - 拼接时专门判断新增列的下一列(原
APPLICATION_STATUS列),用单个制表符连接,其他列保持原格式。
- 用
- 非首行处理:完全沿用你原来的AWK逻辑,确保其他行的格式和新增列值不变。
期望输出示例
APPLICATION ODATE IF_EXECUTING CYCLE_NUMBER APPLICATION_STATUS Job1 20200731 Post four NOTOK Job2 20200731 Post four NOTOK Job3 20200731 Post four NOTOK JOb3 20200731 Post four NOTOK
(注:首行中CYCLE_NUMBER和APPLICATION_STATUS之间是单个制表符,其余列间隔为三个制表符)
内容的提问来源于stack exchange,提问作者Sourin Biswas
相关产品推荐
相关产品推荐

