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

Linux下多文件夹文本按条件提取合并并添加文件前缀

问题描述

我有如下结构的文件夹及文件:

pe1_file1.txt
pe1_file2.txt
px1_file3.txt
px1_file4.txt  etc

每个文件内的行格式如下:

1123343 34 SDSD XV34 nameofdatabase 34 45455 4545 
1145343 33 SD34 XT45 nameofdatabase 34 45455 4545 

需求:解析文件夹下所有文件,生成一个包含符合特定条件行的文本文件。结果文件需仅保留每行前5个值(直至nameofdatabase),并添加文件名的前3个字符(如pe1、px1)作为首个值。

现有代码会完整输出符合条件的行,需要修改以实现需求:

for FILE in files/*.txt;
do
  firstchar=${FILE:0:4}
  # 如何修改下一行以添加$firstchar(如"pe1")以及$1,$2,$3,$4,$5,$6?
  awk '$3=="SDSD"&&$4=="cardatabase"' $FILE.txt >> TOTAL.txt
done
解决方案

修正后的完整脚本

# 可选:清空结果文件,避免多次执行重复追加内容
> TOTAL.txt

for FILE in files/*.txt; do
  # 提取文件名前缀(下划线前的部分,适配任意路径长度)
  prefix=$(basename "$FILE" | cut -d'_' -f1)
  # 筛选符合条件的行并输出指定格式
  awk -v prefix="$prefix" '$3=="SDSD" && $4=="cardatabase" {
    print prefix, $1, $2, $3, $4, $5
  }' "$FILE" >> TOTAL.txt
done

关键修改说明

  1. 文件名前缀提取:
    原代码${FILE:0:4}会错误取到路径前缀file,改用basename配合cut可以可靠提取文件名中第一个下划线前的部分(比如pe1_file1.txt提取为pe1),不受路径长度影响。

  2. 修正文件路径错误:
    原代码中$FILE.txt多了.txt后缀,FILE变量已经包含完整的.txt文件名,直接用"$FILE"即可。

  3. awk逻辑调整:

    • 用-v prefix="$prefix"将shell变量传入awk环境;
    • 保留原筛选条件$3=="SDSD" && $4=="cardatabase";
    • 输出时先打印前缀,再打印行的前5个字段($1到$5,对应需求中“直至nameofdatabase”的部分),自动用空格分隔。

内容的提问来源于stack exchange,提问作者JFerro

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 03:31:06