paste是 Linux 中用于合并文件行的命令将多个文件的对应行连接成一行默认以制表符分隔。 基本语法paste[选项][文件1][文件2]...# 如果不指定文件或使用 -则从标准输入读取 主要功能行合并将多个文件的对应行合并为一行列合并将多个文件的内容按列合并数据重组重新组织数据格式分隔符控制自定义列之间的分隔符 常用选项选项说明示例-d指定分隔符默认是制表符paste -d, file1 file2-s串行合并将一个文件的所有行合并为一行paste -s file1-从标准输入读取cat file1 | paste - file2-z用 NUL 字符分隔行而不是换行符paste -z file1 file2--help显示帮助信息paste --help--version显示版本信息paste --version 实际应用示例示例 1基本用法# 创建测试文件echo-eA\nB\nCfile1.txtecho-e1\n2\n3file2.txtecho-eX\nY\nZfile3.txt# 1. 默认合并制表符分隔pastefile1.txt file2.txt# 输出# A 1# B 2# C 3# 2. 合并三个文件pastefile1.txt file2.txt file3.txt# 输出# A 1 X# B 2 Y# C 3 Z# 3. 使用逗号分隔paste-d, file1.txt file2.txt# 输出# A,1# B,2# C,3# 4. 使用多个分隔符paste-d,:file1.txt file2.txt file3.txt# 输出# A,1:X# B,2:Y# C,3:Z# 说明分隔符循环使用第一个分隔符用于file1和file2之间# 第二个分隔符用于file2和file3之间然后重复示例 2串行合并# 1. 将一个文件的所有行合并为一行paste-sfile1.txt# 输出A B C# 2. 串行合并并使用指定分隔符paste-s-d, file1.txt# 输出A,B,C# 3. 多个文件串行合并paste-sfile1.txt file2.txt# 输出# A B C# 1 2 3# 4. 串行合并为CSV格式paste-s-d, file1.txt file2.txt# 输出# A,B,C# 1,2,3示例 3与标准输入配合# 1. 从管道读取catfile1.txt|paste- file2.txt# 输出# A 1# B 2# C 3# 2. 多个标准输入catfile1.txt|paste- - -# 每行重复三次# 输出# A A A# B B B# C C C# 3. 组合使用echo-eLine1\nLine2|paste-d: - file2.txt# 输出# Line1:1# Line2:2示例 4数据处理和转换#!/bin/bash# 数据格式转换示例# 创建测试数据catstudents.txtEOF Alice Bob Charlie Diana EOFcatscores.txtEOF 85 92 78 88 EOFcatgrades.txtEOF A B B A- EOFecho 学生成绩表 # 1. 创建CSV格式echo姓名,分数,等级paste-d, students.txt scores.txt grades.txt# 输出# Alice,85,A# Bob,92,B# Charlie,78,B# Diana,88,A-echoecho HTML表格 # 2. 生成HTML表格echotable border1echotrth姓名/thth分数/thth等级/th/trpaste-d students.txt scores.txt grades.txt|whilereadname score grade;doechotrtd$name/tdtd$score/tdtd$grade/td/trdoneecho/tableechoecho Markdown表格 # 3. 生成Markdown表格echo| 姓名 | 分数 | 等级 |echo|------|------|------|paste-d|students.txt scores.txt grades.txt|seds/^/| /; s/$/ |/示例 5列转行和行转列#!/bin/bash# 行列转换# 创建测试数据catdata.txtEOF 姓名:Alice 年龄:25 城市:北京 姓名:Bob 年龄:30 城市:上海 EOFecho 原始数据 catdata.txtechoecho 列转行 # 1. 将每三行合并为一行paste- - -data.txt# 输出# 姓名:Alice 年龄:25 城市:北京# 姓名:Bob 年龄:30 城市:上海echoecho 行转列 # 2. 将一行拆分为多列catdata.txt|paste-s-d:|tr:\n# 输出# 姓名:Alice:年龄:25:城市:北京:姓名:Bob:年龄:30:城市:上海# 然后通过 tr 将冒号转换为换行echoecho 创建键值对表格 # 3. 创建键值对表格echo键,值1,值2echo姓名,Alice,Bobecho年龄,25,30echo城市,北京,上海示例 6日志文件处理#!/bin/bash# 日志文件合并分析# 创建测试日志catapp1.logEOF 2024-01-01 10:00:00 INFO Starting service 2024-01-01 10:00:05 INFO Service started 2024-01-01 10:00:10 ERROR Connection failed 2024-01-01 10:00:15 WARN Retrying connection EOFcatapp2.logEOF 2024-01-01 10:00:01 INFO Starting service 2024-01-01 10:00:06 INFO Service started 2024-01-01 10:00:11 ERROR Connection failed 2024-01-01 10:00:16 WARN Retrying connection EOFcatapp3.logEOF 2024-01-01 10:00:02 INFO Starting service 2024-01-01 10:00:07 INFO Service started 2024-01-01 10:00:12 ERROR Connection failed 2024-01-01 10:00:17 WARN Retrying connection EOFecho 并行查看日志 # 1. 并行查看多个应用日志paste-d | app1.log app2.log app3.log# 输出# 2024-01-01 10:00:00 INFO Starting service | 2024-01-01 10:00:01 INFO Starting service | 2024-01-01 10:00:02 INFO Starting service# 2024-01-01 10:00:05 INFO Service started | 2024-01-01 10:00:06 INFO Service started | 2024-01-01 10:00:07 INFO Service started# ...echoecho 提取错误时间线 # 2. 提取所有错误发生的时间grepERRORapp1.log|cut-d -f1-3errors1.txtgrepERRORapp2.log|cut-d -f1-3errors2.txtgrepERRORapp3.log|cut-d -f1-3errors3.txtecho应用1错误时间 | 应用2错误时间 | 应用3错误时间paste-d | errors1.txt errors2.txt errors3.txtechoecho 统计日志级别 # 3. 统计各应用日志级别forappinapp1 app2 app3;doecho$app.log 日志级别统计 grep-oINFO\|ERROR\|WARN$app.log|sort|uniq-c|\paste- - -# 将三行合并为一行done示例 7CSV 文件处理#!/bin/bash# CSV文件处理# 创建测试CSV文件catemployees.csvEOF ID,Name,Department,Salary 101,Alice,Engineering,80000 102,Bob,Marketing,75000 103,Charlie,Sales,70000 104,Diana,Engineering,85000 EOFcatbonuses.csvEOF ID,Bonus 101,5000 102,3000 103,4000 104,6000 EOFcatprojects.csvEOF ID,Projects 101,5 102,3 103,4 104,6 EOFecho 合并员工信息 # 1. 合并多个CSV文件跳过标题行tail-n2 employees.csvemp_data.txttail-n2 bonuses.csvbonus_data.txttail-n2 projects.csvproject_data.txt# 按ID合并paste-d, emp_data.txt bonus_data.txt project_data.txt|\awk-F,{print $1,$2,$3,$4,$6,$8}# 输出# 101,Alice,Engineering,80000,5000,5# 102,Bob,Marketing,75000,3000,3# 103,Charlie,Sales,70000,4000,4# 104,Diana,Engineering,85000,6000,6echoecho 创建完整报表 # 2. 创建完整报表echo员工ID,姓名,部门,工资,奖金,项目数,总收入paste-d, emp_data.txt bonus_data.txt project_data.txt|\awk-F,{ total $4 $6 printf %s,%s,%s,%s,%s,%s,%s\n, $1, $2, $3, $4, $6, $8, total }echoecho 部门统计 # 3. 按部门统计echo部门,员工数,平均工资,平均奖金cut-d, -f3,4 employees.csv|tail-n2|sortdept_salary.txtcut-d,-f2bonuses.csv|tail-n2bonus_list.txtpaste-d, dept_salary.txt bonus_list.txt|\awk-F,{ dept[$1] salary[$1] $2 bonus[$1] $3 } END { for (d in dept) { avg_salary salary[d] / dept[d] avg_bonus bonus[d] / dept[d] printf %s,%d,%.2f,%.2f\n, d, dept[d], avg_salary, avg_bonus } }示例 8文本处理和格式化#!/bin/bash# 文本格式化和对齐# 创建测试数据catnames.txtEOF Alice Bob Charlie Diana Edward Fiona George Hannah EOFcatemails.txtEOF aliceexample.com bobexample.com charlieexample.com dianaexample.com edwardexample.com fionaexample.com georgeexample.com hannahexample.com EOFcatphones.txtEOF 123-456-7890 234-567-8901 345-678-9012 456-789-0123 567-890-1234 678-901-2345 789-012-3456 890-123-4567 EOFecho 对齐的通讯录 # 1. 使用 column 命令对齐pastenames.txt emails.txt phones.txt|column-t-s$\t# 输出# Alice aliceexample.com 123-456-7890# Bob bobexample.com 234-567-8901# Charlie charlieexample.com 345-678-9012# ...echoecho 创建HTML列表 # 2. 创建HTML无序列表echoulpaste-d names.txt emails.txt phones.txt|whilereadname email phone;doecho li$name: a hrefmailto:$email$email/a | Tel:$phone/lidoneecho/ulechoecho 创建Markdown表格 # 3. 创建Markdown表格echo| 姓名 | 邮箱 | 电话 |echo|------|------|------|paste-d|names.txt emails.txt phones.txt|seds/^/| /; s/$/ |/echoecho 创建CSV文件 # 4. 创建CSV文件echo姓名,邮箱,电话paste-d,names.txt emails.txt phones.txt|seds/^//; s/,/,/g; s/$//echoecho 创建固定宽度格式 # 5. 创建固定宽度格式pastenames.txt emails.txt phones.txt|\awk-F\t{ printf %-10s %-25s %-12s\n, $1, $2, $3 }示例 9系统监控和报告#!/bin/bash# 系统监控报告echo 系统状态报告$(date)echo# 1. 收集系统信息echo1. CPU和内存使用情况:cpu_usage$(top-bn1|grepCpu(s)|awk{print $2}|cut-d%-f1)mem_total$(free-h|grepMem|awk{print $2})mem_used$(free-h|grepMem|awk{print $3})mem_free$(free-h|grepMem|awk{print $4})echoCPU使用率:${cpu_usage}%echo内存总量:$mem_totalecho已用内存:$mem_usedecho可用内存:$mem_freeecho# 2. 磁盘使用情况echo2. 磁盘使用情况:df-h|grep-E^/dev|awk{print $1,$5,$6}|\paste- - -# 每三行合并为一行echo# 3. 网络连接统计echo3. 网络连接统计:ss-tun|tail-n2|awk{print $5}|cut-d:-f1|sort|uniq-c|sort-rn|head-5|\whilereadcountip;doecho$ip:$count个连接done|paste-s-d, echo# 4. 进程统计echo4. 进程统计:echo总进程数:$(psaux|wc-l)echo用户进程数:$(ps-u$(whoami)|wc-l)echoroot进程数:$(ps-uroot|wc-l)echo# 5. 登录用户echo5. 当前登录用户:who|cut-d -f1|sort|uniq-c|\whilereadcount user;doecho$user:$count个会话done|paste-s-d, echo# 6. 系统负载echo6. 系统负载:uptime|awk-Fload average:{print $2}|\paste-d - - -|awk{print 1分钟:, $1, 5分钟:, $2, 15分钟:, $3}示例 10高级数据操作#!/bin/bash# 高级数据操作技巧# 创建测试数据seq110numbers.txtseq1120numbers2.txtseq2130numbers3.txtecho 矩阵转置 # 1. 矩阵转置3x10 转置为 10x3pastenumbers.txt numbers2.txt numbers3.txtmatrix.txtecho原始矩阵3列x10行:catmatrix.txt|head-5echoecho转置矩阵10列x3行:# 使用 awk 进行转置awk { for (i1; iNF; i) { a[NR,i] $i } } END { for (j1; jNF; j) { for (i1; iNR; i) { printf %s%s, a[i,j], (iNR ? \n : \t) } } }matrix.txt|head-3echoecho 数据分块 # 2. 将数据分成固定大小的块echo将1-30的数字分成5个一组:catnumbers.txt numbers2.txt numbers3.txt|\paste- - - - -# 每5个数字一行# 输出# 1 2 3 4 5# 6 7 8 9 10# ...echoecho 创建数据对 # 3. 创建数据对用于组合测试catitems.txtEOF apple banana cherry date EOFcatcolors.txtEOF red yellow red brown EOFecho水果和颜色组合:paste-d items.txt colors.txt# 输出# apple red# banana yellow# cherry red# date brownechoecho 创建测试用例 # 4. 创建测试用例catinputs.txtEOF test1 test2 test3 test4 EOFcatexpected.txtEOF result1 result2 result3 result4 EOFecho测试用例:paste-d:inputs.txt expected.txt|\awk-F:{print 测试输入: $1, 期望输出: $2} 常见问题解决问题 1文件行数不一致# 当文件行数不同时paste 会用空行补齐echo-eA\nB\nCfile1.txtecho-e1\n2file2.txtpastefile1.txt file2.txt# 输出# A 1# B 2# C 空# 解决方案使用 -s 选项或处理空行paste-d file1.txt file2.txt|sed/^ $/d问题 2处理包含制表符的文件# 如果文件本身包含制表符使用其他分隔符paste-d|file1.txt file2.txt# 或使用不可见字符作为分隔符paste-d$\001file1.txt file2.txt# 使用SOH字符ASCII 1问题 3大量文件合并# 合并大量文件时使用通配符paste-d, data*.txtcombined.csv# 或使用 find 命令find.-name*.log-execpaste-d {}all_logs.txt问题 4性能优化# 处理大文件时使用缓冲pastelarge1.txt large2.txt|pv-s$(($(wc-clarge1.txt)$(wc-clarge2.txt)))output.txt# 或使用 parallel 处理parallel-kpaste-d {1}{2}::: file1.txt ::: file2.txt 使用技巧分隔符循环-d选项可以接受多个字符会循环使用paste-d,;:file1 file2 file3 file4# file1和file2之间用逗号file2和file3之间用分号# file3和file4之间用冒号然后重复与 cut 命令配合paste 和 cut 是互补命令# 先切割再合并cut-d, -f1,3 data.csv|paste-d, - -创建测试数据快速生成测试数据paste-d$\n(seq15)(seq610)|shuf处理 CSV 文件结合其他工具处理 CSVpaste-d,(cut-d,-f1file1.csv)(cut-d,-f2file2.csv)文本对齐结合 column 命令美化输出pastefile1.txt file2.txt|column-t-s$\t⚠️ 注意事项行尾换行符paste 会保留输入文件的行尾换行符空文件处理如果某个文件为空对应列会全部为空大文件处理处理大文件时注意内存使用分隔符转义特殊字符需要转义或使用引号编码问题确保所有文件使用相同的字符编码paste命令是文本处理的强大工具特别适合需要合并多个文件对应行的场景。掌握 paste 命令可以大大提高文本数据处理的效率。