如何使用sed或awk在TXT文件第4个位置添加列?
在文本文件指定位置插入新列的Linux命令解决方案
原文件内容
name space valid date1 date2 abc mon yes 2022-10-10 2022-10-10 def tue yes 2022-10-10 2022-10-10 ghi wed yes 2022-10-10 2022-10-10 jkl thu yes 2022-10-10 2022-10-10
需求
在第4个位置插入一列,表头为location,所有数据行该列内容统一为newyork,最终效果如下:
name space valid location date1 date2 abc mon yes newyork 2022-10-10 2022-10-10 def tue yes newyork 2022-10-10 2022-10-10 ghi wed yes newyork 2022-10-10 2022-10-10 jkl thu yes newyork 2022-10-10 2022-10-10
你的命令问题分析
你之前的awk命令错误地将逗号设为分隔符,但原文件是空格分隔;同时修改$3的逻辑也不符合插入列的需求,导致无法正确实现效果。
解决方案
方法1:使用awk实现
基础版(快速实现,不严格对齐)
awk默认会将连续空格视为分隔符,直接在第3个字段后插入新内容即可:
awk 'NR==1 {print $1, $2, $3, "location", $4, $5} NR>1 {print $1, $2, $3, "newyork", $4, $5}' values.txt
对齐版(匹配原文件格式)
用printf控制列宽,保证输出和原文件格式一致:
awk 'NR==1 {printf "%-8s %-6s %-6s %-10s %-12s %-12s\n", $1, $2, $3, "location", $4, $5} NR>1 {printf "%-8s %-6s %-6s %-10s %-12s %-12s\n", $1, $2, $3, "newyork", $4, $5}' values.txt
%-8s表示左对齐并占用8个字符宽度,可根据原文件列宽调整数值,确保格式统一。
方法2:使用sed实现
针对表头和数据行分别做替换,匹配原文件空白格式:
sed -e '1s/\(valid\s*\)/\1location /' -e '2,$s/\(yes\s*\)/\1newyork /' values.txt
1s/.../.../处理第一行,在valid后的空白处插入location和对应空格2,$s/.../.../处理第2行到末尾,在yes后的空白处插入newyork和对应空格
内容的提问来源于stack exchange,提问作者Neoneuron
相关产品推荐
相关产品推荐

