如何通过Shell循环读取文件中以>符号分隔的独立数据块
Shell按分隔符读取文件分块问题
现有数据格式
数据文件filex内使用单独成行的>作为块分隔符,存储多组三列数值数据,样例内容如下:
10.00 4.85 2.80 16.00 6.25 3.61 22.00 6.40 3.70 25.00 6.80 3.79 > 100.00 4.85 2.80 160.00 6.25 3.61 220.00 6.40 3.70 250.00 6.80 3.79 > 100.00 4.85 2.88 160.00 6.25 3.68 220.00 6.40 3.78 250.00 6.80 3.78 >
需求是遍历读取所有被>分隔的数据块并打印,原有编写的Shell代码无法运行:
while read block do ccc=sed 's/.*[>] * //' $block echo $ccc done < filex
原有代码问题
- 逐行读取逻辑不符合需求:
while read默认按换行符读取单行内容,不会自动按>切分块 - 命令赋值语法错误:Shell中捕获命令输出需要用
$(命令)包裹,直接写ccc=sed会把sed当成变量值字符串,不会执行命令 - 传参逻辑错误:sed后接
$block会把读取到的行内容当成文件名去读取,完全不符合处理文本内容的预期
可行实现方案
方案1:纯Shell循环分块读取
适合需要在循环内对单块内容做复杂Shell逻辑处理的场景:
#!/bin/bash block_cache="" # 逐行读取,兼容文件末尾无换行的情况 while IFS= read -r line || [[ -n "$line" ]]; do # 碰到分隔符行,输出当前缓存的块内容 if [[ "$line" == ">" ]]; then # 过滤块首尾空行后打印 echo "$block_cache" | sed '/^$/d' echo "===== 块分隔线 =====" # 清空缓存准备读下一块 block_cache="" else # 非分隔符行追加到块缓存 block_cache+="$line"$'\n' fi done < filex
方案2:awk一键分块
适合大文件处理,代码更简洁执行效率更高:
# 直接把>加换行设为记录分隔符,自动按块切分 awk 'BEGIN{RS=">\n"} NF>0{print "===== 第"NR"个数据块 ====="; print $0}' filex
两种方案运行后都会按顺序输出每一块的三列数值数据,你可以把打印块的位置替换成自己的业务处理逻辑。
内容的提问来源于stack exchange,提问作者manas
相关产品推荐
相关产品推荐

