Shell脚本如何合并多个文件按列

wen 实用脚本 7

本文目录导读:

Shell脚本如何合并多个文件按列

  1. 使用 paste 命令(最常用)
  2. 使用 pr 命令
  3. 使用 awk 命令(更灵活)
  4. 使用 join 命令(需要共同列)
  5. 处理CSV文件示例
  6. 实用脚本示例

在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

抱歉,评论功能暂时关闭!