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
关键修改说明
文件名前缀提取:
原代码${FILE:0:4}会错误取到路径前缀file,改用basename配合cut可以可靠提取文件名中第一个下划线前的部分(比如pe1_file1.txt提取为pe1),不受路径长度影响。修正文件路径错误:
原代码中$FILE.txt多了.txt后缀,FILE变量已经包含完整的.txt文件名,直接用"$FILE"即可。awk逻辑调整:
- 用
-v prefix="$prefix"将shell变量传入awk环境; - 保留原筛选条件
$3=="SDSD" && $4=="cardatabase"; - 输出时先打印前缀,再打印行的前5个字段(
$1到$5,对应需求中“直至nameofdatabase”的部分),自动用空格分隔。
- 用
内容的提问来源于stack exchange,提问作者JFerro
相关产品推荐
相关产品推荐

