DEBUG.WIKI
V.PS:让项目靠近用户,亚太、欧洲、北美 KVM VPS
IPPeak:从目标地区访问网页,住宅代理、SEO 监测、广告验证
ZgoCloud:多地区部署,按需选节点;日本、美国、香港、德国

paste -d abc 合并两列时只插入 a

GNU paste 的 -d 按边界轮用字符列表。两个输入每行只有一个边界;加入空输入可生成固定短分隔串,并须保留空列与行号配对边界。

运行 paste -d 'abc' left.txt right.txt,希望两列之间出现完整的 abc,结果却只有 a。改用双引号、增加反斜杠,仍然不能让三个字符同时出现。

GNU paste 的 -d 参数是一份依次使用的分隔字符列表,不是每个字段边界都要插入的完整字符串。两个输入文件在每一行只有一个连接边界,因此只用到列表里的第一个字符。

分隔符按同一输出行的边界依次使用

假设 left.txt 两行是 L1、L2,right.txt 两行是 R1、R2。下面的命令预期输出 L1aR1 和 L2aR2:

paste -d 'abc' ./left.txt ./right.txt

下一输出行又从列表开头开始,不会把第二行换成 b。如果有三个输入文件,同一行的两个边界才分别使用 a、b;需要的边界更多、列表已经用完时,再从头循环。

这个规则与 shell 是否把参数完整传递无关。单引号已经能保护这里的普通字符,继续堆转义不会把“字符列表”变成“字符串分隔符”。以下示例采用普通 ASCII 分隔符,不把多字节字符的行为推广到所有 paste 实现。

固定短分隔串可以增加空输入列

要在两个文件之间放入 abc,可以让中间两个输入始终为空,从而产生三个连接边界:

paste -d 'abc' ./left.txt /dev/null /dev/null ./right.txt

四个输入依次贡献左侧内容、空内容、空内容、右侧内容,三个边界分别插入 a、b、c。预期得到 L1abcR1 和 L2abcR2。读取 /dev/null 不产生数据;这里没有写入它,也没有创建临时文件。

若只需要两个连续 Tab,用默认分隔符并加一个空输入即可:

paste ./left.txt /dev/null ./right.txt

这会留下一个空字段,不只是让终端多显示一点间距。下游若按连续空白合并分词,可能仍把这个空字段丢掉,应按真实文件格式验收。

同样,paste -d '\t\t' left.txt right.txt 在两个输入之间只有一个边界,仍只会插入一个 Tab。\0 在 GNU paste 的分隔列表中代表空字符串,并不是输出一个 NUL 字节;两种用途不能混淆。

paste 按行号配对,不检查业务键

普通并行模式会取各文件对应行来拼接。某个文件先结束时,后续位置视作空内容,其他文件仍继续输出。因此中间使用 /dev/null 可行,但这也意味着两份实际数据长度不同不会自动变成业务校验错误。

先确认文件每行一条记录、顺序已经对应,且分隔串不会使下游误分字段。若两份文件要按账号、订单号等键关联,paste 不会代替连接操作;同样行数也不能证明记录身份相配。

不要为了让分隔符看起来完整而加 -s。-s 改为依次合并单个文件内部的各行,会改变记录组织方式,并非普通列合并的字符串分隔开关。

固定的短 ASCII 串适合上述空列办法。任意长度、含转义的动态分隔串,应使用明确支持整串输出的文本处理逻辑,并单独规定缺失记录的处理,不建议自动拼接一大串未经检查的 shell 参数。

验证输出时保留空列和原文件

用各两行的样本确认两行都包含完整分隔串,再检查空行及两边记录数不同的情况。Tab 在终端上不容易区分,可以用 od -An -tx1 -c 查看输出样本中的字节;不要只凭肉眼对齐判断有几个字段。

上述命令只向标准输出写结果。正式落盘时选择未占用的新文件,不能重定向回任一输入文件。保留输入、旧命令和下游解析规则;如果分隔方式不符合要求,可以重新生成结果,不要在已经丢失空字段信息的导入数据上猜测恢复。