如何在Bash中实现两个文本文件的全量行组合(带|分隔符)
实现两个文件行的全量笛卡尔积组合
没问题,这其实是典型的文本笛卡尔积组合需求,在Bash里有好几种实用的实现方式,我给你列几个常用的方案,你可以根据自己的场景选择:
方案1:Bash嵌套循环(直观易懂)
这是最容易理解的方式,用两层循环分别读取两个文件的内容,逐个拼接输出:
while read -r line_from_file2; do while read -r line_from_file1; do echo "$line_from_file2|$line_from_file1" done < file1.txt done < file2.txt
如果需要把结果保存到新文件,只需要在命令末尾加上 > combined_result.txt即可。
方案2:用awk实现(高效推荐)
对于内容较多的文件,awk的效率会比Bash循环高很多。我们可以先把file2.txt的所有行存入数组,再遍历file1.txt的每一行和数组元素组合:
awk 'NR==FNR {lines_of_file2[$0]; next} {for (line in lines_of_file2) print line "|" $0}' file2.txt file1.txt
NR==FNR:awk的内置变量,当处理第一个输入文件(这里是file2.txt)时,执行花括号内的逻辑,把每一行存入数组lines_of_file2next:跳过后续逻辑,继续处理下一行- 处理第二个文件(
file1.txt)时,遍历数组里的每一行,和当前行按|分隔拼接输出
方案3:用paste+yes的简洁写法
如果你喜欢更简洁的单行命令,可以结合yes和paste来实现:
# 先获取file1的行数 count=$(wc -l < file1.txt) # 重复file2的每一行count次,再和file1逐行拼接 yes "$(cat file2.txt)" | head -n $((count * $(wc -l < file2.txt))) | paste -d'|' - file1.txt
这个思路是先让file2.txt的每一行重复file1.txt的行数,再用paste把重复后的内容和file1.txt逐行拼接。
额外小技巧
- 如果需要对结果排序,可以在命令末尾加上
| sort - 如果担心有重复行需要去重,可以加上
| sort -u
内容的提问来源于stack exchange,提问作者A1277
相关产品推荐
相关产品推荐

