UNIX 如何实现文件特定列下的指定字符交换操作
分号分隔文本指定列值交换实现流程
前置规则确认
- 源文件
file.txt采用英文分号;作为列分隔符 - 列结构固定,仅第三列始终为11位纯数字,其余列长度动态可变,无固定长度要求
- 处理目标:将第三列的最后两位数字位置互换(如原末两位为
01则调整为10),处理结果写入独立新文件,不修改覆盖源文件
核心处理逻辑
逐行读取源文件内容,全程不需要适配其他列的长度变化,仅针对固定特征的第三列做调整:
- 跳过读取过程中的空行,避免生成格式错乱的无效记录
- 对每行内容按分号拆分得到独立列值,定位到数组中索引为2的第三列值
- 对第三列值做定点调整:截取该值的前9位,依次拼接倒数第一位、倒数第二位字符,生成调整后的新第三列值
- 将调整后的所有列重新用分号拼接为完整行,写入目标新文件
可直接落地的实现方案
1. 跨平台Python实现(兼容性最强,适配Windows/Linux/macOS全环境)
# 以只读模式打开源文件,以写入模式创建新的结果文件 with open("file.txt", "r", encoding="utf-8") as src, open("file_modified.txt", "w", encoding="utf-8") as dst: for line in src: line = line.strip() # 跳过空行 if not line: continue col_list = line.split(";") # 定位第三列值 third_col = col_list[2] # 做数据合法性校验:第三列必须是11位数字,不符合则输出异常提示不做修改 if len(third_col) != 11 or not third_col.isdigit(): print(f"检测到异常行内容:{line},第三列不符合固定11位数字规则,已跳过处理") continue # 交换最后两位:取前9位 + 倒数第1位 + 倒数第2位 new_third_col = third_col[:9] + third_col[-1] + third_col[-2] col_list[2] = new_third_col # 重新拼接为完整行写入结果文件 dst.write(";".join(col_list) + "\n")
处理效果验证:
- 原第一行第三列值
12345678901,处理后得到12345678910 - 原第二行第三列值
98765432201,处理后得到98765432210
完全匹配末尾两位从01交换为10的要求。
2. Linux/macOS 环境sed命令实现(无需写脚本,直接执行)
sed 's/^\([^;]*;[^;]*;\)\([0-9]\{9\}\)\(.\)\(.\)\(;.*\)$/\1\2\4\3\5/' file.txt > file_modified.txt
匹配逻辑说明:
- 规则中前面的通配部分自动适配前两列、第四列的任意长度内容,不受文本长度动态变化的影响
- 精准匹配第三列的11位数字结构:识别出第三列的前9位数字,将后续两个单独捕获的字符顺序互换,完成末尾两位的交换操作
内容的提问来源于stack exchange,提问作者Kannan Prince
相关产品推荐
相关产品推荐

