Unix下修改指定列分隔符:将.txt文件第5、6列空格改为Tab
解决Unix下异构列分隔符转换问题
嘿,这个不同列用不同分隔符的场景我之前处理过,给你两个实用的方案,根据你的文本复杂度选就行:
方案一:用awk处理(推荐,逻辑清晰易调整)
awk天生就是为处理列数据设计的,这个场景下能精准控制每一列的输出逻辑:
awk -F'\t' '{ # 先输出前4列,保持Tab分隔格式 for (i=1; i<=4; i++) { printf "%s%s", $i, (i < 4 ? "\t" : "") } # 处理第5列及后续内容:把原第5、6列之间的空格替换成Tab if ($5 != "") { sub(/ /, "\t", $5) printf "\t%s", $5 } printf "\n" }' A.txt > B.txt
关键说明:
-F'\t'指定以Tab作为前几列的分隔符,这样$1-$4对应前4列,$5则包含原第5列+空格+原第6列(如果存在的话)sub(/ /, "\t", $5)仅替换$5里的第一个空格为Tab,完美匹配你描述的第5、6列分隔规则- 如果某行存在列缺失(比如只有前3列),脚本会自动跳过处理,保持原格式不变
方案二:用sed快速替换(适合格式规整的简单场景)
如果你的文本格式很规整(比如第5列内部绝对没有空格),用sed一行命令就能快速搞定:
sed 's/\(\([^\t]*\t\)\{4\}[^\t]*\) /\1\t/' A.txt > B.txt
关键说明:
- 正则表达式
\([^\t]*\t\)\{4\}精准匹配前4个Tab分隔的字段 [^\t]*匹配原第5列的内容- 最后把匹配到的内容后面的空格替换成Tab,刚好定位到第5、6列之间的分隔符
- 没有第6列的行不会被修改,完全兼容列缺失的情况
要是你的第5列内部可能包含空格,那优先选awk方案,还能轻松调整匹配逻辑(比如改成替换最后一个空格)。
内容的提问来源于stack exchange,提问作者Lucas
相关产品推荐
相关产品推荐

