简介
文本文件之间可能存在不同的关联方式。有时需要规范化字符;有时两个文件按行位置一一对应;有时多条记录共享同一个关键词。选择合适的匹配工具,比记住命令选项更重要。
本实验介绍 3 个用途明确的工具:tr 转换字符流,paste 按行位置合并内容,join 按共享字段合并已排序的记录。你将检查每个输入文件,并在构建一个小型报告之前验证生成的文件。
转换并清理字符流
在本步骤中,使用 tr 转换字符、压缩重复分隔符并删除不需要的字符。
先创建一行格式故意不一致的内容。cat -A 会显示通常不可见的细节:空格仍显示为空白间隔,$ 表示行尾。这样可以准确看出需要清理的内容:
cd /home/labex/project/text-combine-lab
printf ' API,,,Worker,,WEB \n' > raw-services.txt
cat -A raw-services.txt
tr SET1 SET2 会将第一个字符集合中的字符替换为第二个字符集合中对应的字符。可移植的字符类 [:upper:] 和 [:lower:] 分别表示大写字母和小写字母:
tr '[:upper:]' '[:lower:]' < raw-services.txt
现在将 3 个阶段通过管道连接起来。第一个 tr 将字母转换为小写;tr -s ',' 会将每一段连续重复的逗号压缩为一个逗号;tr -d ' ' 会删除空格字符;tee 则显示并保存最终的字符流:
tr '[:upper:]' '[:lower:]' < raw-services.txt | tr -s ',' | tr -d ' ' | tee clean-services.txt
结果应为 api,worker,web。tr 读取字符流,不会直接修改输入文件。
使用 Paste 合并对应行
在本步骤中,合并两个文件:第一个文件的第 1 行与第二个文件的第 1 行对应,第 2 行与第 2 行对应,依此类推。
创建一列服务名称和一列负责人:
cd /home/labex/project/text-combine-lab
printf '%s\n' api worker web > services.txt
printf '%s\n' team-blue team-green team-blue > owners.txt
paste 会将对应的行并排放置,默认使用制表符分隔:
paste services.txt owners.txt
使用 -d, 选择逗号作为分隔符,并使用 tee 显示和保存类似 CSV 的文件:
paste -d, services.txt owners.txt | tee service-owners.csv
paste 不会比较关键词。如果某个文件缺少行,或者行的顺序发生变化,对应关系也会随之改变。
根据共享关键词连接记录
在本步骤中,按照匹配的第一个字段合并记录,而不是按行位置合并。
创建两个以空格分隔、且顺序不同的表格:
cd /home/labex/project/text-combine-lab
printf '%s\n' 'web 8080' 'api 9000' 'worker 9100' > ports-unsorted.txt
printf '%s\n' 'worker active' 'web active' 'api maintenance' > states-unsorted.txt
join 要求两个输入文件都按连接字段排序。先准备排序后的副本。在 sort -k1,1 中,-k 用于选择排序关键词,1,1 表示「从第 1 个字段开始,到第 1 个字段结束」,因此只有服务名称会决定排序顺序:
sort -k1,1 ports-unsorted.txt > ports.txt
sort -k1,1 states-unsorted.txt > states.txt
查看这两个文件,然后连接第 1 个字段值相同的记录:
cat ports.txt
cat states.txt
join ports.txt states.txt | tee service-details.txt
每条结果都会包含一次共享的服务关键词,后面依次是端口和状态。
构建易读的服务报告
在本步骤中,重新组织连接后的记录,同时不修改源表格。
将空格转换为逗号,生成简单的报告:
cd /home/labex/project/text-combine-lab
tr ' ' ',' < service-details.txt | tee service-report.csv
通过组合两个命令添加表头。花括号会将两个命令的输出合并后,一起重定向到文件:
{ echo 'service,port,state'; cat service-report.csv; } > service-report-with-header.csv
cat service-report-with-header.csv
统计数据记录数,但不统计表头:
tail -n +2 service-report-with-header.csv | wc -l | tr -d ' ' > service-count.txt
cat service-count.txt
这个工作流保留了多个小而易检查的阶段:规范化数据、连接后的数据、格式化数据,最后生成报告。
总结
你使用 tr 进行字符级规范化,使用 paste 合并按位置对应的列,使用 join 处理已排序的关键词关系。随后,你将多个小阶段组合成易读的 CSV 报告,同时保持原始输入文件不变。



