如何用awk/shell/sed为文本文件末尾加列:前2000行填0,后3000行填1
针对你需要给文本文件末尾新增一列,前2000行填'0'、接下来3000行填'1'的需求,我整理了几个实用的实现方案,覆盖awk、Shell和sed三种工具,你可以根据自己的熟悉程度选择:
1. AWK 方案(最推荐)
AWK天生擅长处理行和列的操作,代码简洁且效率高:
awk '{if (NR <= 2000) print $0, "0"; else if (NR <= 5000) print $0, "1"; else print $0}' input.txt > output.txt
解释:
NR是AWK的内置变量,代表当前处理的行号- 前2000行:在每行末尾追加
0(注意用空格分隔新列和原内容) - 2001到5000行:追加
1 - 超过5000行的内容保持原样(如果文件行数多于5000)
- 结果输出到
output.txt,避免直接修改原文件(更安全)
如果你想直接修改原文件(仅GNU AWK支持),可以加-i inplace参数:
awk -i inplace '{if (NR <=2000) print $0,"0"; else if (NR <=5000) print $0,"1"; else print $0}' input.txt
2. Shell 脚本方案
用head和tail拆分文件后分别处理,适合不熟悉AWK的用户:
# 创建临时文件存储结果 touch temp.txt # 处理前2000行,添加列值0 head -n 2000 input.txt | while read -r line; do echo "$line 0"; done > temp.txt # 处理第2001到5000行,添加列值1 tail -n +2001 input.txt | head -n 3000 | while read -r line; do echo "$line 1"; done >> temp.txt # 处理剩余行(如果文件行数超过5000) tail -n +5001 input.txt >> temp.txt # 替换原文件(可选,执行前请确认原文件已备份) mv temp.txt input.txt
解释:
- 用
head -n 2000提取前2000行,tail -n +2001提取从2001行开始的内容 while read -r line逐行读取并追加列值- 最后合并所有处理后的内容到临时文件,再替换原文件
3. Sed 方案(适合熟悉Sed的用户)
Sed通过行地址范围和替换命令实现,代码紧凑:
sed -e '1,2000s/$/ 0/' -e '2001,5000s/$/ 1/' input.txt > output.txt
解释:
1,2000s/$/ 0/:对1到2000行,将行尾($)替换为0,实现追加列的效果2001,5000s/$/ 1/:同理处理2001到5000行- 超过5000行的内容不做修改
如果要直接修改原文件,加-i参数(仅GNU Sed支持):
内容的提问来源于stack exchange,提问作者Doodle
相关产品推荐
相关产品推荐

