You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按顺序将文件赋值为变量并读取日志文件处理.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
问题分析与解决方案

核心问题

  1. 原find命令用%f只输出文件名,没有保存文件的完整路径,导致后续运行rnxEditGde.py时,程序在主目录下找不到子文件夹里的.gz文件。
  2. 循环中的{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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 05:40:41