如何按顺序将文件赋值为变量并读取日志文件处理.gz文件?
问题描述
我在一个主文件夹下有10个子文件夹,每个子文件夹下有10个.gz文件。需要从主文件夹进入子文件夹,按91到99的顺序取出这些.gz文件进行处理。我已将所有文件按顺序打印到log3文件中,现在想了解如何按顺序将文件赋值为变量,以及如何在代码中再次按顺序读取这些文件?
我通过以下代码已按顺序生成了log、log2、log3文件:
find . -name '*.gz' -printf '%f\0' | sort -z | while IFS='' read -r -d '' fname do printf '%s\n' "${fname:0:4}" >&3 printf '%s\n' "${fname:16:17}" >&4 printf '%s\n' "${fname:0:100}" >&5 done \ 3> >(tee -a receiver_ids > log) \ 4> >(tee -a doy > log2) \ 5> >(tee -a data_record > log3)
但我无法通过这些日志文件运行rnxEditGde.py。我尝试了以下代码,但程序无法找到-dataFile参数对应的文件:
for j in {091..099}; do ionex=$(pl $j log) summary=$(pl $j log2) dataRecordFile=$(pl $j log3) gd2e.py -mkTreeS Trees sed -i "s/jplg.*/$ionex/g" $dir/Trees/ppp_0.tree rnxEditGde.py -dataFile "$dataRecordFile" -o dataRecordFile.Orig.gz
问题分析与解决方案
核心问题
- 原
find命令用%f只输出文件名,没有保存文件的完整路径,导致后续运行rnxEditGde.py时,程序在主目录下找不到子文件夹里的.gz文件。 - 循环中的
{091..099}是带前导零的字符串,若pl是取行号的命令,行号应为纯数字(91-99),否则会读取错误的行内容。
修正后的代码
第一步:重新生成包含完整路径的日志文件
修改find命令的输出参数,保存文件的完整相对路径到log3:
find . -name '*.gz' -printf '%p\0' | # 用%p代替%f,输出完整文件路径 sort -z | while IFS='' read -r -d '' fpath do fname=$(basename "$fpath") # 从完整路径中提取文件名 printf '%s\n' "${fname:0:4}" >&3 printf '%s\n' "${fname:16:17}" >&4 printf '%s\n' "$fpath" >&5 # 将完整路径写入log3 done \ 3> >(tee -a receiver_ids > log) \ 4> >(tee -a doy > log2) \ 5> >(tee -a data_record > log3)
第二步:按顺序读取日志并处理文件
用通用的sed命令读取对应行的内容,确保变量包含完整文件路径:
# 遍历91到99的行号(假设log/log2/log3的行号从1开始,且排序后这些行对应目标文件) for line_num in {91..99}; do # 读取对应行的内容 ionex=$(sed -n "${line_num}p" log) summary=$(sed -n "${line_num}p" log2) dataRecordFile=$(sed -n "${line_num}p" log3) # 执行原有操作 gd2e.py -mkTreeS Trees sed -i "s/jplg.*/$ionex/g" ./Trees/ppp_0.tree # 用相对路径避免找不到文件 # 用完整路径调用rnxEditGde.py,输出文件名基于原文件命名,避免重名覆盖 rnxEditGde.py -dataFile "$dataRecordFile" -o "${dataRecordFile%.gz}.Orig.gz" done
关键说明
find的%p参数会输出文件的完整相对路径(比如./subfolder/file.gz),确保程序能准确定位到子文件夹中的文件。sed -n "${line_num}p"用于读取文件的第N行,替代pl命令(如果pl是自定义取行工具也可保留,但sed是跨环境通用方案)。${dataRecordFile%.gz}.Orig.gz会把原文件的.gz后缀替换为.Orig.gz,避免所有输出文件重名覆盖。
内容的提问来源于stack exchange,提问作者EBayraktar
相关产品推荐
相关产品推荐

