paste 命令用于将多个文件的对应行合并在一起,默认使用制表符(Tab)作为分隔符。它是文本处理和数据整理中非常有用的工具,特别适合处理列格式的数据。
paste [选项] [文件...]
常用形式:
# 合并两个文件
paste 文件1 文件2
# 合并多个文件
paste 文件1 文件2 文件3
# 从标准输入读取
命令1 | paste - 文件1
# 创建测试文件
echo -e "Alice\nBob\nCharlie" > names.txt
echo -e "25\n30\n35" > ages.txt
echo -e "Engineer\nDesigner\nManager" > jobs.txt
# 合并文件(默认用制表符分隔)
paste names.txt ages.txt
# 输出:
# Alice 25
# Bob 30
# Charlie 35
# 合并三个文件
paste names.txt ages.txt jobs.txt
# 输出:
# Alice 25 Engineer
# Bob 30 Designer
# Charlie 35 Manager
# 使用逗号分隔
paste -d ',' names.txt ages.txt
# 输出:
# Alice,25
# Bob,30
# Charlie,35
# 使用分号分隔
paste -d ';' names.txt ages.txt jobs.txt
# 使用多个分隔符(循环使用)
paste -d ',:' names.txt ages.txt jobs.txt
# 输出:
# Alice,25:Engineer
# Bob,30:Designer
# Charlie,35:Manager
# 将每个文件的所有行合并为一行
paste -s names.txt ages.txt
# 输出:
# Alice Bob Charlie
# 25 30 35
# 串行合并并使用自定义分隔符
paste -s -d ',' names.txt
# 输出:Alice,Bob,Charlie
paste -s -d ':' names.txt ages.txt
# 输出:
# Alice:Bob:Charlie
# 25:30:35
# 从管道读取数据
echo -e "John\nJane" | paste - names.txt
# 输出:
# John Alice
# Jane Bob
# Charlie
# 使用多个标准输入
seq 1 3 | paste - - -
# 输出:
# 1 2 3
# 合并命令输出
ls | head -3 | paste -s -d ','
# 输出:file1,file2,file3
# 创建CSV格式数据
echo -e "姓名,年龄,职业\nAlice,25,工程师\nBob,30,设计师" > data.csv
# 提取各列并重新组合
cut -d ',' -f1 data.csv > names.csv
cut -d ',' -f2 data.csv > ages.csv
cut -d ',' -f3 data.csv > jobs.csv
# 重新合并为制表符分隔
paste names.csv ages.csv jobs.csv
# 输出:
# 姓名 年龄 职业
# Alice 25 工程师
# Bob 30 设计师
# 生成服务器配置
echo -e "web01\nweb02\ndb01\ndb02" > hosts.txt
echo -e "192.168.1.10\n192.168.1.11\n192.168.1.20\n192.168.1.21" > ips.txt
echo -e "nginx\nnginx\nmysql\nmysql" > services.txt
# 生成 hosts 文件格式
paste ips.txt hosts.txt | sed 's/\t/ /' > /etc/hosts.new
# 生成服务配置
paste -d ':' hosts.txt ips.txt services.txt > server_list.csv
# 合并多个日志文件的时间戳和内容
cut -d ' ' -f1 access.log > timestamps.txt
cut -d ' ' -f7 access.log > urls.txt
# 创建简化的日志视图
paste timestamps.txt urls.txt > simplified.log
# 统计URL访问频率
cut -d ' ' -f7 access.log | sort | uniq -c | sort -nr > url_counts.txt
paste -s -d ',' url_counts.txt | sed 's/,/\n/g' > url_frequency.csv
#!/bin/bash
# 处理用户数据
# 生成测试数据
generate_data() {
echo "生成用户数据..."
for i in {1..5}; do
echo "user$i"
done > users.txt
for i in {1..5}; do
echo "$((20 + RANDOM % 40))"
done > user_ages.txt
for i in {1..5}; do
echo "password$i"
done > passwords.txt
}
# 合并数据
merge_data() {
echo "合并数据..."
paste -d ':' users.txt user_ages.txt passwords.txt > users_data.txt
echo "用户数据已保存到 users_data.txt"
# 显示结果
echo "=== 用户数据 ==="
column -t -s ':' users_data.txt
}
generate_data
merge_data
# 使用多个分隔符循环
echo -e "A\nB\nC" > col1.txt
echo -e "1\n2\n3" > col2.txt
echo -e "X\nY\nZ" > col3.txt
paste -d ',;:' col1.txt col2.txt col3.txt
# 输出:
# A,1;X
# B,2;Y
# C,3;Z
# 创建JSON数组
paste -s -d ',' numbers.txt | sed 's/^/[/; s/$/]/'
# 输出:[1,2,3,4,5]
# 简单的数据转置
echo -e "1\n2\n3\n4\n5" > col.txt
# 转置为一行
paste -s -d '\t' col.txt
# 输出:1 2 3 4 5
# 转置矩阵数据
echo -e "1 2 3\n4 5 6" > matrix.txt
awk '{for(i=1;i<=NF;i++)a[i]=a[i]?a[i]"\t"$i:$i} END{for(i=1;i<=NF;i++)print a[i]}' matrix.txt | paste -s
# 处理合并后的数据
paste names.txt ages.txt | awk '{print "姓名:", $1, "年龄:", $2}'
# 输出:
# 姓名: Alice 年龄: 25
# 姓名: Bob 年龄: 30
# 姓名: Charlie 年龄: 35
# 计算平均年龄
paste -s -d '+' ages.txt | bc
# 输出:90
#!/bin/bash
# 批量处理多个数据文件
# 创建多个数据文件
for i in {1..3}; do
seq $i 2 $((i + 4)) > "data$i.txt"
done
# 合并所有文件
paste data*.txt > combined.txt
echo "原始文件:"
for file in data*.txt; do
echo "=== $file ==="
cat "$file"
done
echo "合并结果:"
cat combined.txt
# 清理
rm data*.txt combined.txt
| 命令 | 功能 | 适用场景 |
|---|---|---|
paste |
按行合并文件 | 合并多个文件的对应行,创建表格数据 |
cat |
连接文件 | 按顺序连接文件内容 |
join |
基于共同字段连接文件 | 类似SQL JOIN操作,基于匹配字段连接 |
pr |
格式化文本为多列 | 将文本分栏显示 |
awk |
强大的文本处理 | 复杂的文本处理和数据提取 |
paste -s -d ',' 可以快速创建CSV格式的数据cut 命令可以重新排列数据列的顺序column -t 可以让制表符分隔的数据对齐显示paste 可以简化数据处理流程-d 选项时,可以用 \t 表示制表符,\n 表示换行符-d 选项时,分隔符列表会循环使用