如何使用Shell内置命令、head、cat、tail和wc逐行合并两个文件?
当然可以!根据你的需求,我提供两种场景的实现方案,都只用到Shell内置命令、head、tail和wc:
场景1:每个数字单独占一行
假设你的文件内容是每行一个数字:
file1内容:
1
2
3file2内容:
4
5
6
可以用以下脚本实现:
#!/bin/bash # 获取文件行数(假设两个文件行数相同) line_count=$(wc -l < file1) merged_result="" # 循环遍历每一行,交替提取两个文件的对应行内容 for ((i=1; i<=line_count; i++)); do # 提取file1的第i行 f1_content=$(head -n "$i" file1 | tail -n 1) # 提取file2的第i行 f2_content=$(head -n "$i" file2 | tail -n 1) # 拼接结果 merged_result="$merged_result $f1_content $f2_content" done # 输出结果(去掉开头多余的空格) echo "${merged_result# }"
脚本解释:
wc -l < file1:用wc统计file1的行数,因为我们假设两个文件行数一致。head -n "$i" file1 | tail -n 1:通过head取前i行,再用tail取最后一行,以此获取第i行的内容,这是在没有sed或awk的情况下的替代方法。- 循环中把两个文件的对应行内容拼接到结果变量里,最后用
${merged_result# }去除开头的空格,输出最终的1 4 2 5 3 6。
场景2:所有数字在同一行
如果你的文件是一行包含所有数字(比如file1是1 2 3,file2是4 5 6),可以用Shell内置的read命令拆分内容为数组,再交替拼接:
#!/bin/bash # 读取file1的内容到数组arr1 read -ra arr1 < file1 # 读取file2的内容到数组arr2 read -ra arr2 < file2 merged_result="" # 遍历数组索引,交替拼接元素 for ((i=0; i<${#arr1[@]}; i++)); do merged_result="$merged_result ${arr1[$i]} ${arr2[$i]}" done # 输出结果 echo "${merged_result# }"
脚本解释:
read -ra arr1 < file1:用内置的read命令,-r表示不转义反斜杠,-a表示把读取的内容按空格拆分成数组arr1。${#arr1[@]}获取数组的长度,循环遍历每个索引,交替取两个数组的元素拼接。- 最后输出拼接好的结果,同样去除开头的空格。
这两种方案都完全符合你要求的工具限制,你可以根据自己的实际文件格式选择对应的脚本~
内容的提问来源于stack exchange,提问作者AkaMirai
相关产品推荐
相关产品推荐

