如何用awk、sed或其他工具将文本内数字分成225组(每组129个)?
用awk快速实现分组需求
这个需求用awk来处理最直接高效,而且你的数字总数刚好是225×129=29025,完美匹配分组规则,不会有剩余数字~下面分两种场景给出实现方案:
场景1:已有包含连续数字的文本文件(每行一个数字)
假设你的数字文件名为numbers.txt,直接用下面的awk命令就能生成想要的格式:
awk 'BEGIN{group=1; count=0} { count++ if (count == 1) { printf "[ Lipid %d ] ", group } printf "%s", $0 if (count == 129) { print "" count = 0 group++ } else { printf " " } }' numbers.txt
逻辑解释:
BEGIN块初始化两个计数器:group记录当前组号(从1开始),count记录组内已处理的数字个数(从0开始)。- 每读取一个数字,
count加1;如果是组内第一个数字,先打印[ Lipid X ]前缀。 - 打印当前数字后,判断是否达到组内129个数字的上限:如果是,换行并重置计数器、递增组号;否则打印空格分隔下一个数字。
场景2:没有现成文件,直接生成数字并分组
如果不需要预先保存数字文件,可以用seq命令生成29026到58050的连续数字,再管道给awk处理:
seq 29026 58050 | awk 'BEGIN{group=1; count=0} { count++ if (count == 1) { printf "[ Lipid %d ] ", group } printf "%s", $0 if (count == 129) { print "" count = 0 group++ } else { printf " " } }'
备选方案:用split+sed组合实现
如果你偏好多个工具配合,也可以先把文件拆分成225个小文件(每个129行),再给每个文件添加前缀并合并:
# 拆分文件,每个小文件129行 split -l 129 numbers.txt temp_group_ # 遍历每个小文件,添加前缀并转换为一行 for i in $(seq 1 225); do # 给每个文件的第一行添加[ Lipid X ]前缀 sed "1s/^/[ Lipid $i ] /" temp_group_$(printf "%02d" $i) | # 把换行符换成空格 tr '\n' ' ' | # 去掉行尾多余的空格 sed 's/ $//' done # 清理临时文件 rm temp_group_*
这个方案步骤稍多,适合喜欢分步处理的场景,但效率不如awk单命令高。
内容的提问来源于stack exchange,提问作者Jakub
相关产品推荐
相关产品推荐

