本文目录导读:

在Shell脚本中,合并多个文件按列有多种方法,这里介绍几种常用方式:
使用 paste 命令(最常用)
# 合并两个文件,默认用制表符分隔 paste file1.txt file2.txt # 使用指定分隔符 paste -d',' file1.txt file2.txt # 合并多个文件 paste file1.txt file2.txt file3.txt
示例:
# file1.txt 内容: # 1 apple # 2 banana # file2.txt 内容: # 3 orange # 4 grape paste file1.txt file2.txt # 输出: # 1 apple 3 orange # 2 banana 4 grape
使用 pr 命令
# 按列合并,指定宽度 pr -m -t -w 100 file1.txt file2.txt # 参数说明: # -m:合并文件 # -t:不输出页眉/页脚 # -w:指定输出宽度
使用 awk 命令(更灵活)
# 合并两个文件,用空格分隔
awk 'FNR==NR {a[FNR]=$0; next} {print a[FNR], $0}' file1.txt file2.txt
# 使用逗号分隔
awk 'FNR==NR {a[FNR]=$0; next} {print a[FNR]","$0}' file1.txt file2.txt
使用 join 命令(需要共同列)
# 基于第一列连接(文件需先排序) sort -k1 file1.txt > file1_sorted.txt sort -k1 file2.txt > file2_sorted.txt join file1_sorted.txt file2_sorted.txt
处理CSV文件示例
# 合并两个CSV文件的特定列 paste -d',' <(cut -d',' -f1 file1.csv) <(cut -d',' -f2 file2.csv)
实用脚本示例
#!/bin/bash
# 合并多个文件按列,支持自定义分隔符
merge_files_by_column() {
local delimiter="${1:-\t}" # 默认制表符
shift
local files=("$@")
if [ ${#files[@]} -lt 2 ]; then
echo "至少需要两个文件"
return 1
fi
paste -d"$delimiter" "${files[@]}"
}
# 使用示例
merge_files_by_column "," file1.txt file2.txt file3.txt
注意事项:
paste适用于文件行数相同的情况- 如果文件行数不同,短文件会补空
- 对于大文件,
paste性能最好 awk方法最灵活,可以自定义处理逻辑
选择哪种方法取决于你的具体需求:简单合并用 paste,复杂逻辑用 awk,需要连接操作用 join。