如何在Bash中合并三个文件数据生成指定格式输出?
Bash合并三个文件数据的实现方法
核心需求回顾
- File1:仅包含单个日期值
20230118 - File2:多行键值对数据(如
key1=value1、key2=value2格式) - File3:仅包含单个数字值
15678 - 目标:将三个文件的数据按指定格式合并输出
方法一:使用Awk(推荐,灵活易扩展)
Awk可直接在脚本内读取多文件变量,适合处理结构化文本合并。
场景1:每行键值对附加日期和编号
若需将File1、File3的值作为全局字段,追加到File2每行首尾(逗号分隔),执行命令:
awk ' BEGIN { # 读取File1日期并清除换行 getline date < "File1" gsub(/[\r\n]/, "", date) # 读取File3编号并清除换行 getline num < "File3" gsub(/[\r\n]/, "", num) } # 拼接每行内容输出 { print date "," $0 "," num } ' File2
场景2:生成结构化分段输出
若需按「日期-键值对-编号」的分段格式输出,命令如下:
awk ' BEGIN { getline date < "File1" gsub(/[\r\n]/, "", date) getline num < "File3" gsub(/[\r\n]/, "", num) print "Date: " date print "---" print "Key-Value Pairs:" } # 输出所有键值对 { print } END { print "---" print "ID: " num } ' File2
方法二:使用Shell变量+Sed
先通过Shell命令读取File1、File3的值,再用Sed修改File2内容,适合简单字符串替换场景:
# 读取文件值并去除换行符 date=$(cat File1 | tr -d '\n') num=$(cat File3 | tr -d '\n') # 在File2每行首尾追加日期和编号 sed "s/^/$date,/; s/$/,$num/" File2
注意事项
- 如果File1/File3存在多余换行或空白字符,务必用
tr -d '\n'或gsub(/[\r\n]/, "", var)清除,避免输出格式混乱。 - 若需对File2的键值对做拆分、过滤等操作,优先选择Awk,它对字段操作的支持远优于Sed。
内容的提问来源于stack exchange,提问作者saanvi
相关产品推荐
相关产品推荐

