Bash脚本需求:合并多TXT文件并添加ID与会话列
解决多TXT文件合并为三列格式的问题
我懂你的痛点——现在你要把多个单列的TXT文件合并成包含人员ID、会话编号、数值的三列格式,但当前脚本只在每个文件的第一行带上前两列,后面的行都缺失了这两个关键信息对吧?
问题出在你的脚本只给每个文件的第一行添加了ID和会话号,而正确的逻辑应该是给每个文件的每一行都重复对应的人员ID和会话编号,毕竟整个文件都是属于同一个人员同一会话的数据。
下面给你两种常用的解决方案,你可以根据自己的环境选择:
方案一:Python脚本(灵活易调整)
如果你的文件名能体现人员ID和会话编号(比如person_1_session_1.txt),可以用这个自动提取的版本:
import os # 请替换成你的TXT文件存放目录 input_directory = "./your_txt_files_folder" # 合并后的输出文件名 output_filename = "merged_data.txt" with open(output_filename, "w", encoding="utf-8") as output_file: # 遍历目录下所有TXT文件 for file_name in os.listdir(input_directory): if not file_name.endswith(".txt"): continue # 跳过非TXT文件 # 从文件名提取人员ID和会话编号,这里假设文件名格式是person_{ID}_session_{会话号}.txt # 如果你文件名格式不同,修改这里的拆分逻辑就行 name_parts = file_name.replace(".txt", "").split("_") person_id = name_parts[1] session_number = name_parts[3] # 读取当前文件的每一行,拼接三列内容写入 with open(os.path.join(input_directory, file_name), "r", encoding="utf-8") as input_file: for line in input_file: value = line.strip() if value: # 跳过空行 output_file.write(f"{person_id} {session_number} {value}\n")
如果你的文件名没有规律,那就手动指定每个文件对应的ID和会话号:
# 手动映射:(文件名, 人员ID, 会话编号) file_mappings = [ ("userA_session1.txt", "1", "1"), ("userA_session2.txt", "1", "2"), ("userB_session1.txt", "2", "1"), # 继续添加其他文件 ] output_filename = "merged_data.txt" with open(output_filename, "w", encoding="utf-8") as output_file: for file_name, pid, sid in file_mappings: with open(file_name, "r", encoding="utf-8") as input_file: for line in input_file: value = line.strip() if value: output_file.write(f"{pid} {sid} {value}\n")
方案二:Bash Shell脚本(适合Linux/macOS环境)
如果你习惯用命令行,这个脚本更快捷:
# 假设你的文件命名格式是personX_sessionY.txt,X是人员ID,Y是会话号 # 合并后的输出文件 output_file="merged_data.txt" # 清空输出文件(避免重复追加) > "$output_file" # 遍历所有目标TXT文件 for txt_file in person*.txt; do # 从文件名提取人员ID和会话编号 person_id=$(echo "$txt_file" | cut -d'_' -f2) session_num=$(echo "$txt_file" | cut -d'_' -f3 | sed 's/.txt//') # 给每一行添加前缀并写入输出文件 awk -v pid="$person_id" -v sid="$session_num" '{print pid, sid, $0}' "$txt_file" >> "$output_file" done
关键注意点
- 一定要根据你自己的实际文件名格式调整ID和会话号的提取逻辑,不然会出错
- 如果你的TXT文件里有空行,代码里的
if value:(Python)会自动跳过,避免生成无效行 - 合并后的文件会严格按照你期望的格式:
1 1 000、1 1 001...1 2 177这样的顺序排列
内容的提问来源于stack exchange,提问作者ayherrera
相关产品推荐
相关产品推荐

