Linux/R环境下处理制表符分隔文件:删除最后一列逗号后的多余内容
制表符分隔文件的最后列截取实现
Linux 终端操作
sed实现:- 精准适配版本(仅修改最后一列,不影响其他列):
sed 's/\(\t[^\t]*\),[^\t]*$/\1/' 待处理文件.txt
该命令通过正则锚定行尾位置,只匹配最后一个制表符后的内容,将最后一列里逗号及之后的部分替换为逗号前的内容,不会误改其他列的文本。需要直接修改原文件的话,在命令里添加-i参数;需要保留原文件备份的话,用-i.bak参数,会自动生成同文件名加.bak后缀的原文件副本。 - 简易版本(适用于确定仅最后一列存在逗号的场景):
sed 's/,.*$//' 待处理文件.txt
- 精准适配版本(仅修改最后一列,不影响其他列):
awk实现(终端场景优先推荐,鲁棒性最强):
执行命令:awk -F '\t' 'BEGIN{OFS="\t"} {sub(/,.*/, "", $NF); print}' 待处理文件.txt
该命令将输入、输出的字段分隔符统一设置为制表符,直接定位到最后一列,仅对该列执行逗号后的内容删除操作,哪怕其他列意外包含逗号,也不会出现错改的问题,完全匹配制表符分隔文件的处理逻辑。
R 环境操作
- 读入原制表符分隔文件:
df <- read.delim("待处理文件路径.txt", sep = "\t", stringsAsFactors = FALSE, header = FALSE)
若原文件包含表头,将header = FALSE改为TRUE即可。 - 截取最后一列中逗号前的内容:
df[[ncol(df)]] <- sub(",.*", "", df[[ncol(df)]]) - 导出为保持原格式的制表符分隔文件:
write.table(df, "处理后结果.txt", sep = "\t", quote = FALSE, row.names = FALSE, col.names = FALSE)
其中quote = FALSE是避免文本被自动添加引号,row.names、col.names设为FALSE是和原文件的无表头格式保持一致。
内容的提问来源于stack exchange,提问作者Khan_16
相关产品推荐
相关产品推荐

