You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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_file2
  • next:跳过后续逻辑,继续处理下一行
  • 处理第二个文件(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:45:55