如何用Shell脚本按规则读取两文件并写入第三个文件?
按行匹配两文件生成目标内容的脚本修正
现有文件内容
file-A:
Red Green Blue Yellow
file-B:
Car Bus Van Bike
预期输出(file-C):
Red Car Green Bus Green Blue Blue Blue Yellow
原脚本问题
你原来的脚本把file-B的所有内容读成一个变量,然后在每个颜色的循环里遍历所有车辆,导致所有颜色和车辆的组合重复输出,根本没做到按行对应匹配的要求。
修正后的两种实现方案
方案一:用文件描述符同时读两个文件
这种方法直接同步读取两个文件的对应行,逻辑清晰:
# 用文件描述符3绑定file-A,4绑定file-B while read -r color <&3 && read -r vehicle <&4; do case "$color" in Red) echo "$color $vehicle" ;; Green) echo "$color $vehicle $color" ;; Blue) echo "$color $color $color" ;; Yellow) echo "$color" ;; esac done 3<file-A 4<file-B > file-C
方案二:把车辆存入数组按索引匹配
如果更贴近你原来的思路,可以先把file-B的行存到数组里,再按索引对应读取:
# 将file-B的所有行存入数组vehicles mapfile -t vehicles < file-B index=0 # 遍历file-A的每一行颜色 while read -r color; do vehicle=${vehicles[$index]} # 根据颜色生成对应格式的输出 case "$color" in Red) echo "$color $vehicle" ;; Green) echo "$color $vehicle $color" ;; Blue) echo "$color $color $color" ;; Yellow) echo "$color" ;; esac ((index++)) done < file-A > file-C
说明
两种方案都能保证file-A和file-B的行一一对应,再通过case语句根据不同颜色生成符合要求的输出,完全匹配预期结果。
内容的提问来源于stack exchange,提问作者Zero5
相关产品推荐
相关产品推荐

